2017-07-03 66 views
6

我的问题可能是直接的,但我无法弄清幕后发生了什么。我正在循环访问数据库表中的一系列域,向他们呼叫,获取SSL证书并将其保存到数据库中。当环路退出时,节点https回调不会触发

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

数据库检索开头检查:

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); 
}); 
} 

值得一提的是,如果我把之前的console.log https.request,我见它在我的控制台。然而,回调中的任何日志都无法触发(因为回调本身从不触发)。

再一次,回调的一些时间。它只是靠近数据库循环的结尾,它似乎停止工作。任何意见,将不胜感激!

+1

如果在'callback = function(response){'It logs后面添加'console.log(response)什么? – gnuns

+7

你确定回调有时会引发火灾?您似乎没有调用'req.end()',这是您的请求实际发送的时间。您的请求似乎永远在等待您写入正文。 –

+1

为什么我们在获取数据函数中有2个结束事件? –

回答

5

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

req.end(); 
相关问题