【问题标题】:Node https callback not firing when loop exits循环退出时节点https回调未触发
【发布时间】:2017-12-07 02:57:39
【问题描述】:

我的问题可能很直接,但我无法弄清楚幕后发生了什么。我正在遍历数据库表中的一系列域,调用它们,获取 SSL 证书并将有关它的信息存储回数据库中。

在大多数情况下,它都在工作 - 除非循环退出任何尚未完成的调用,否则就会停止。

开始检查的数据库检索:

function queryRows() {
    complete = false;
    var query = c.query("SELECT * FROM domains LIMIT 100 OFFSET " + offset);
    query.on('result', function(res) {
        res.on('data', function(row) {
        checkUrl(row)
        }).on('end', function() {
            complete = true;
        });
    }).on('end', function() {
        console.log(complete);
        offset += 100;
        if(offset <= (parseInt(rows) + 400)){
            queryRows();
        } else {
            console.log("Done, waiting");
            setTimeoutPromise(600000, 'foobar').then((value) => {
                console.log("restarting")
                offset = 0;
                getTotal();
            });
        }
    });
}

以及检查 SSL 的代码:

function checkSSL(id, domain){
    complete = false 
    var options = {
        host: domain,
        rejectUnauthorized: false
    };

    callback = function(response) {
        var str = '';
        try {
            if(domain == "arstechnica.com"){
                console.log("Found ars - savingCertificate");
            }
            cert = response.connection.getPeerCertificate(true);
            complete = hasSSL(cert, domain, id);
            // updateDomainRecord(cert, domain, id)
        } catch (error){
            console.log(error);
            complete = true;
            noSSLRecord(domain, id);
        }
    }
    const req = https.request(options, callback);
    req.on('error', (e) => {
        // console.error(e);
    });
}

值得注意的是,如果我在 https.request 之前放置一个 console.log,我会在我的控制台中看到它。但是回调中的任何日志都无法触发(因为回调本身永远不会触发)。

同样,回调有时会发生。它仅在数据库循环结束时似乎停止工作。任何建议将不胜感激!

【问题讨论】:

  • 如果你在callback = function(response) { 之后添加console.log(response) 它会记录什么?
  • 您确定回调有时会触发吗?您似乎没有打电话给req.end(),这是您的请求实际发送的时间。您的请求似乎一直在等待您为其写入正文。
  • 为什么我们在获取数据函数中有 2 个结束事件?
  • 这可能是@BrettBeatty 指出的,除此之外 - complete = hasSSL(cert, domain, id); 是什么,它与您的函数定义不一致。

标签: node.js ssl https mariasql


【解决方案1】:

看起来您的请求永远不会被发送,所以callback 永远不会被解雇。确保您的请求实际上正在发送,因此您必须在最后添加一行:

req.end();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2016-11-23
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多