6

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

同样,有时回调确实如此。它仅在数据库循环结束时似乎停止工作。任何意见,将不胜感激!

4

1 回答 1

5

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

req.end();
于 2017-07-10T21:06:36.053 回答