nodejs模块superagent如何设置超时及超时后如何处理?
在使用 superagent 模块进行 HTTP 请求时,可以使用 timeout() 方法设置超时时间,该方法接收一个数字类型的参数,表示超时时间的毫秒数。如果请求超时,超时错误将被传递给回调函数
const superagent = require('superagent');
superagent
.get('https://example.com')
.timeout(5000) // 设置超时时间为 5 秒
.end((err, res) => {
if (err && err.timeout) {
console.log('请求超时');
} else if (err) {
console.error(err);
} else {
console.log(res.text);
}
});
在上面的示例中,如果请求超时,控制台将输出 "请求超时"。
注意:如果未设置超时时间,请求将无限期等待响应。
另外,如果需要在超时后进行一些特殊处理,可以使用 on('error', ...) 方法处理超时错误,如下所示:
const superagent = require('superagent');
superagent
.get('https://example.com')
.timeout(5000)
.on('error', (err) => {
if (err.timeout) {
console.log('请求超时');
} else {
console.error(err);
}
})
.end((err, res) => {
if (!err) {
console.log(res.text);
}
});
在上面的示例中,on('error', ...) 方法会监听请求的错误事件,并根据错误类型进行处理。如果是超时错误,控制台将输出 "请求超时"。
在superagent中,可以通过设置timeout方法来设置请求超时时间。该方法接受一个毫秒数作为超时时间,超过这个时间后请求会被中断并触发超时回调函数。
示例代码如下:
const request = require('superagent');
request
.get('https://example.com/api')
.timeout({response: 5000, deadline: 10000}) // 设置超时时间
.then(res => {
// 处理响应
})
.catch(err => {
if (err.timeout) {
// 处理超时错误
} else {
// 处理其他错误
}
});
在timeout方法中,可以设置response和deadline两个参数。response表示服务器响应的最大等待时间,如果在这个时间内服务器没有响应,则会触发超时回调函数。deadline表示整个请求的最大等待时间,包括DNS解析、TCP连接、服务器响应等等,如果在这个时间内请求没有完成,则会触发超时回调函数。
在超时回调函数中,可以根据需要进行处理,比如重新发起请求、返回错误信息等等。
在superagent模块中,可以使用.timeout()方法来设置请求超时时间,该方法接受一个参数,即超时时间(单位为毫秒),例如:
const request = require('superagent');
request.get('http://example.com/api')
.timeout(5000) // 设置超时时间为5秒
.end((err, res) => {
if (err && err.timeout) {
console.log('请求超时');
// 处理超时的情况
} else if (err) {
console.error(err);
// 处理其他错误
} else {
console.log(res.text);
// 处理正常的响应
}
});
注意,超时设置只是一个建议值,实际超时时间可能会比设置的时间长。如果需要精确控制超时时间,可以结合使用setTimeout()和.abort()方法,例如:
const request = require('superagent');
const timeout = 5000; // 设置超时时间为5秒
const req = request.get('http://example.com/api')
.timeout(timeout) // 设置超时时间
.end((err, res) => {
if (err && err.timeout) {
console.log('请求超时');
req.abort(); // 中断请求
// 处理超时的情况
} else if (err) {
console.error(err);
// 处理其他错误
} else {
console.log(res.text);
// 处理正常的响应
}
});
setTimeout(() => {
if (!req.aborted) {
req.abort(); // 超时后中断请求
}
}, timeout);
在上面的例子中,我使用了setTimeout()方法来计时,如果超时时间到了但请求还没有结束,就中断请求并执行相应的处理。注意,需要判断请求是否已经中断,否则可能会出现错误。