NodeJS,HTTP 请求有时不调用回调

NodeJS, HTTP Request doesn't Call a Callback Sometimes

提问人:Miroslav Popov 提问时间:12/4/2021 最后编辑:Miroslav Popov 更新时间:12/5/2021 访问量:633

问:

我正在 Nodejs 下开发一个 Request 服务。我在生产中使用它一年多了,它工作正常,但是,在某些情况下它会卡住。它很少发生在特定类型的请求中,但我无法隔离和修复这种情况。

当请求不调用 .看起来我错过了某种错误事件。我抓住了:,,,......callbackerroraborttimeoutend

我错过了什么?

function sendRequest(options, postData, callback) {

    const req = https.request(options, reqCallback);

    req.on('error', (err) => {
        callback(err.message, null);
    });

    req.on('abort', () => {
        callback('Request abort', null);
    });

    req.on('timeout', () => {
        callback('Request timeout', null);
    });

    if (postData) {
        req.write(postData);
    }

    req.end();

    function reqCallback(res) {
        const chunks = [];

        res.on('data', (chunk) => {
            chunks.push(chunk);
        });

        res.on('end', () => {
            let body = null;
            let err  = null;

            try {
                body = Buffer.concat(chunks).toString();
            } catch (e) {
                err = e.message;
            }

            callback(err, body);
        });

        res.on('aborted', () => {
            callback('Response aborted', null);
        })
    }
}
节点.js HTTPS 回调 请求

评论


答:

0赞 Miroslav Popov 12/5/2021 #1

当目标服务器保持请求打开状态并且没有响应时,请求似乎挂起。

我添加了一个标题。它接受以秒为单位的时间。但是,服务器可能会也可能不会执行超时。Request-Timeout

我直接在请求中添加了超时,如下所示。

function sendRequest(options, postData, callback) {
    const req = https.request(options, reqCallback)

    if (options.headers && typeof options.headers['Request-Timeout'] === 'number') {
        req.setTimeout(options.headers['Request-Timeout'] * 1000)
    }

    req.on('timeout', () => {
        // Destroy the request to prevent a double callback call.
        req.destroy()
    })
    
    // ...
}

我还在事件处理程序的正文中添加了一个特定的。 如果服务器决定在某个时刻做出响应,它会阻止后续的回调调用。req.destroy()timeout