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);
    });

解释

  1. 函数定义:定义一个名为 makeRequestWithTimeout 的函数,接受 URL、请求选项和超时时间作为参数。
  2. Promise:使用 Promise 来处理异步操作,确保我们可以使用 .then().catch() 方法来处理成功和失败的情况。
  3. 创建请求:使用 http.request 创建一个 HTTP 请求对象。
  4. 设置超时:通过调用 req.setTimeout(timeout, callback) 方法来设置超时时间。当请求时间超过设定的超时时间时,会触发回调函数,并调用 req.destroy() 来终止请求。
  5. 错误处理:为请求添加错误处理事件 req.on('error', callback),以便捕获任何可能发生的错误。
  6. 发送请求:调用 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())。这样可以确保不会无限期地等待响应。

回到顶部