2017-07-03 58 views
6

Mój problem jest prawdopodobnie prosty, ale nie mogę zrozumieć, co dzieje się za kulisami. Przeszukuję serię domen w tabeli bazy danych, wywołując je, przechwytując certyfikat SSL i zapisując informacje o nim z powrotem do bazy danych.Węzeł zwrotny https nie jest uruchamiany po zamknięciu pętli

W większości przypadków działa - z wyjątkiem sytuacji, gdy pętla kończy wszystkie połączenia, które nie zostały zakończone, po prostu zatrzymaj się.

pobieranie

Database że zaczyna check:

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

I kod, który sprawdza 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); 
}); 
} 

Warto zauważyć, że jeśli mogę umieścić console.log przed https.request widzę to w mojej konsoli. Jednak wszelkie dzienniki w obrębie wywołania zwrotnego nie wyzwalają się (ponieważ samo wywołanie nie jest uruchamiane).

Ponownie, niektóre czasy wywołania zwrotnego. Dopiero pod koniec pętli bazy danych wydaje się, że przestaje działać. Każda rada byłaby doceniona!

+1

Jeśli dodasz 'console.log (odpowiedź)' zaraz po 'callback = function (response) {' It logs coś? – gnuns

+7

Jesteś pewien, że czasami oddzwoni wywołanie zwrotne? Wygląda na to, że nie nazywasz 'req.end()', kiedy twoje żądanie zostanie faktycznie wysłane. Twoja prośba wydaje się wiecznie czekać, aż napiszesz do niej ciało. –

+1

Dlaczego mamy 2 zdarzenia końcowe w funkcji pobierania danych? –

Odpowiedz

5

Wygląda na to, że Twoje żądanie nie jest wysyłane, więc callback nigdy nie zostanie zwolniony. Upewnij się, że żądanie jest wysyłane, więc na końcu musisz dodać jedną linię:

req.end();