一.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将会抛出一个错误。