当循环退出时,节点https回调不会触发

时间:2017-07-03 19:00:18

标签: node.js ssl https mariasql

我的问题可能是直截了当的,但我无法弄清楚幕后发生了什么。我循环遍历数据库表中的一系列域,调用它们,获取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,我会在控制台中看到它。但是回调中的任何日志都无法触发(因为回调本身永远不会触发)。

同样,回调的某些时候。它只是在数据库循环的末尾,它似乎停止工作。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:5)

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

req.end();