2017-07-03 16 views
6

Vấn đề của tôi có lẽ là thẳng về phía trước, nhưng tôi không thể tìm ra điều gì đang xảy ra phía sau hậu trường. Tôi đang lặp qua một loạt các tên miền trong một bảng cơ sở dữ liệu, gọi cho họ, lấy chứng chỉ SSL và lưu trữ thông tin về nó trong cơ sở dữ liệu.Gọi lại https của nút không kích hoạt khi thoát khỏi vòng lặp

Đối với hầu hết các phần, nó hoạt động - trừ khi vòng lặp thoát khỏi bất kỳ cuộc gọi nào chưa hoàn thành, chỉ dừng lại.

Cơ sở dữ liệu phục hồi bắt đầu kiểm tra:

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

Và mã để kiểm tra 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); 
}); 
} 

Nó đáng chú ý rằng nếu tôi đặt một console.log trước https.request, tôi thấy nó trong bảng điều khiển của tôi. Tuy nhiên, bất kỳ nhật ký nào trong hàm gọi lại không kích hoạt (vì chính cuộc gọi lại không bao giờ kích hoạt).

Một lần nữa, một số lần gọi lại. Nó chỉ gần cuối vòng lặp cơ sở dữ liệu, nơi nó dường như ngừng hoạt động. Lời khuyên nào sẽ được đánh giá cao!

+1

Nếu bạn thêm 'console.log (response)' ngay sau 'callback = function (response) {' It logs một cái gì đó? – gnuns

+7

Bạn chắc chắn rằng cuộc gọi lại đôi khi phát sinh? Bạn dường như không gọi 'req.end()', đó là khi yêu cầu của bạn thực sự được gửi đi. Yêu cầu của bạn dường như là vĩnh viễn chờ đợi cho bạn để viết một cơ thể với nó. –

+1

Tại sao chúng tôi có 2 sự kiện kết thúc trong hàm tải dữ liệu? –

Trả lời

5

Có vẻ như yêu cầu của bạn chưa bao giờ được gửi, vì vậy, callback sẽ không bao giờ bị sa thải. Đảm bảo yêu cầu của bạn thực sự được gửi, vì vậy bạn phải thêm một dòng vào cuối:

req.end(); 
Các vấn đề liên quan