Nodejs - httpsRequest 在响应不是 200 的特定时间报告为未定义

Nodejs - httpsRequest reporting back as undefined at certain times when response is not 200

本文关键字:定时间 报告 未定义 httpsRequest 响应 Nodejs      更新时间:2023-09-26

我有下面的JS函数来查询httpsRequest,有时当通过100个URL时,它会通过200个响应,有时它会失败,响应未定义。

 assert.js:86
  throw new assert.AssertionError({
  AssertionError: 200 == undefined
at C:'Users'test'Desktop'node_modules'workers-STAGE.js:73:11
at ClientRequest.<anonymous> (C:'Users'test'Desktop'node_modules'workers-S
   TAGE.js:54:16)
at ClientRequest.emit (events.js:107:17)
at TLSSocket.socketErrorListener (_http_client.js:271:9)
at TLSSocket.emit (events.js:129:20)
at net.js:459:14
at process._tickCallback (node.js:355:11)

我的函数如下

function _httpsRequest(path, callback) {
var options = {
    hostname: domain,
    port: 443,
    path: path,
    method: "GET",
    rejectUnauthorized: false
};
var req = https.request(options, function(res) {
    var dataStr = "";
    res.on("data", function(chunk) {
        dataStr += chunk;
    });
    res.on("end", function() {
        return callback(null, res.statusCode, dataStr);
    });
});
req.on("error", function(e) {
    return callback(e);
});
req.end();

我的问题,有没有办法处理超时,或者响应时间是否比预期的要长,以便在测试 100 个 url 时不会突然停止。

我不确定这是否会解决问题,但也许这将确保您不会多次callback(),以防

万一:
function _httpsRequest(path, callback) {
    var options = {
        hostname: domain,
        port: 443,
        path: path,
        method: "GET",
        rejectUnauthorized: false
    };
    var req = https.request(options, function(res) {
        var dataStr = "";
        res.on("data", function(chunk) {
            dataStr += chunk;
        });
        res.on("end", function() {
            if (responded)
                return;
            responded = true;
            return callback(null, res.statusCode, dataStr);
        });
    });
    var responded = false;
    req.on("error", function(e) {
        if (responded)
            return;
        responded = true;
        return callback(e);
    });
    req.end();
}

如果问题主要发生在并发性问题时,请尝试在请求选项中启用keepAlive

var options = {
    hostname: domain,
    port: 443,
    path: path,
    method: "GET",
    rejectUnauthorized: false,
    keepAlive: true
};