Nodejs 如何设置http.request的timeout?
Nodejs 如何设置http.request的timeout?
如题, 有哪位大神能够解惑一下. http://fengmk2.github.io/blog/2011/08/nodejs_http_request_timeout.html 这是我在网上找的资料, 但上面说有问题.
4 回复
Node.js 如何设置 http.request 的 timeout?
在 Node.js 中使用 http.request 方法发起 HTTP 请求时,默认情况下是没有内置的超时机制的。不过,我们可以通过一些技巧来实现超时功能。
示例代码
const http = require('http');
function makeRequestWithTimeout(url, options, timeout) {
return new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
resolve(data);
});
});
// 设置超时
req.setTimeout(timeout, () => {
req.destroy();
reject(new Error(`请求超时(超过 ${timeout} 毫秒)`));
});
req.on('error', (err) => {
reject(err);
});
req.end();
});
}
// 使用示例
const url = 'http://example.com';
const options = {
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET'
};
const timeout = 5000; // 5 秒
makeRequestWithTimeout(url, options, timeout)
.then((response) => {
console.log('响应数据:', response);
})
.catch((err) => {
console.error('请求错误:', err.message);
});
解释
- 函数定义:定义一个名为
makeRequestWithTimeout的函数,接受 URL、请求选项和超时时间作为参数。 - Promise:使用
Promise来处理异步操作,确保我们可以使用.then()和.catch()方法来处理成功和失败的情况。 - 创建请求:使用
http.request创建一个 HTTP 请求对象。 - 设置超时:通过调用
req.setTimeout(timeout, callback)方法来设置超时时间。当请求时间超过设定的超时时间时,会触发回调函数,并调用req.destroy()来终止请求。 - 错误处理:为请求添加错误处理事件
req.on('error', callback),以便捕获任何可能发生的错误。 - 发送请求:调用
req.end()发送请求。
通过这种方式,你可以灵活地控制请求的超时时间,从而避免长时间等待导致的资源浪费。
那资料的node版本应该0.4.2左右,对比下现在主流的0.8以后的api文档 http://nodejs.org/api/http.html#http_request_settimeout_timeout_callback
多谢
要在 Node.js 中设置 http.request 的超时时间,可以使用 setTimeout 方法来实现。这个方法可以用来设定请求的最大等待时间,如果超过了这个时间还没有完成请求,则会触发一个错误。
以下是一个示例代码:
const http = require('http');
const options = {
hostname: 'example.com',
port: 80,
path: '/path',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
// 设置超时时间为 5 秒
req.setTimeout(5000, () => {
console.log('Request timed out');
req.abort(); // 取消请求
});
req.end();
在这个例子中,我们设置了请求的超时时间为 5 秒。如果请求在这段时间内没有完成,setTimeout 回调会被触发,并且请求会被取消(通过调用 req.abort())。这样可以确保不会无限期地等待响应。

