node中如何同步请求链接

一.sync-request同步请求

sync-request简单介绍:
sync-request是一个Node.js库,它提供了一个同步的HTTP请求功能。这意味着你可以在代码中暂停执行,直到收到HTTP响应。这与Node.js的典型异步模式不同,异步模式通常使用回调函数或Promise来处理HTTP响应。仓库地址

直接使用syncRequest库来请求


1. 安装 npm install sync-request
2. 文件内引入 const syncRequest = require("sync-request"); //引入库
3. 使用
const url = 'https://www.example.com/test'
const result = syncRequest("GET", url);
const resultObj = JSON.parse(result.getBody("utf8"))?.data; //获取uft8格式值

二.使用axios来请求

使用axios来请求。但axios 是基于 Promise 的,因此它本身是异步的,不能直接进行同步请求。但是,可以在 async 函数中使用 await 关键字来等待 axios 请求的结果,从而实现类似同步的效果。

axios简单介绍:
axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。 github开源地址

1.使用方式

1. 安装 npm install axios
2. 引入 const axios = require("axios");
3. 使用
const requestHandle = async (item) => {
  let type = "nonmal";

  async function processingRequest() {
    const instance = axios.create({ //每次都新建一个,否则会携带之前的请求
      timeout: 3000 //超时时间
    }); 

    instance.interceptors.response.use(
      (response) => {
        // 响应拦截器正常响应逻辑
        return response;
      },
      (error) => {
        // 响应拦截器错误处理逻辑
        type = "error"
        return Promise.reject(error);
      }
    );

    await instance
      .get(item, {
        maxRedirects: 0,//监听重定向使用,不监听直接去掉该属性就行 注1
      })
      .then((response) => {
        console.log(response.data);
      })
      .catch((errorItem) => {
        console.log(errorItem);
      });
  }

  await processingRequest();

  return { path: item, type };
};

上面的为基础方法,可根据实际需要进行改装。

2.请求重定向地址方法
在响应拦截器改了点代码,可以请求返回的重定向地址


instance.interceptors.response.use(
      (response) => {
        // 响应拦截器正常响应逻辑
        return response;
      },
      (error) => {
        // 响应拦截器错误处理逻辑
        if (
          error.response &&
          (error.response.status === 301 || error.response.status === 302)
        ) {
          //获取重定向返回的链接
          const redirectUrl = error.response.headers.location.includes("http")
            ? error.response.headers.location
            : error.request.host + error.response.headers.location; 
            //请求一下重定向返回的链接     
            return instance.get(redirectUrl, { maxRedirects: 0 });
          
        }
        type = "error"
        return Promise.reject(error);
      }
    );


三.简单的睡眠方法

很多网站都有一分钟内,同一ip请求次数的限制,所以简单写了个睡眠方法,适用于请求多个链接的情况。

1.睡眠方法

const sleep = function (ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
};

2.说明
sleep函数使用JavaScript的Promise和setTimeout来实现延迟操作,setTimeout(resolve, ms)会在ms毫秒后调用resolve函数。因为resolve函数是Promise的解决函数,所以当resolve被调用时,Promise就会解决,然后所有等待这个Promise的代码就会继续执行。

3.使用

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later');
}

console.log(‘Two seconds later’)会在console.log(‘Taking a break…’)之后的两秒钟打印出来。

四.注解

注1:
maxRedirects: 0 是 axios 配置选项中的一个属性,用于定义在放弃之前,node.js 应该遵循的 HTTP 重定向的最大数量。如果设置为0,那么如果收到一个重定向,axios 将不会进行任何重定向。

在axios中,maxRedirects的默认值为5。这意味着如果一个HTTP请求收到一个重定向响应,axios将会自动遵循重定向,直到达到5次重定向为止。如果超过5次重定向,axios将会抛出一个错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值