Асинхронные https-запросы в node.js - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть приложение, которое запускает https-запросы сторонним сервисам для ведения журнала. По какой-то причине я заметил несколько часов назад, что третья сторона отказывается от соединений. Это другая тема.

В моем приложении node.js я замечаю, что, несмотря на то, что запросы создаются динамически и поэтому не должны зависать во всем приложении, они есть.

После перезапуска процесса запрос https зависает, а затем умирает с ошибкой отказа в соединении. Пример кода ниже.

var logger = function(data){

    var req = https.request({
        host: 'logs.loggly.com',
        port: 443,
        path: '/inputs/<my real key is here, removed obviously>',
        method: 'POST',
        headers:{
            'content-type': 'application/json'
        }
    }, function(res){
        var body = [];
        res.on('chunk', function(data){
            body.push(data);
        });
        res.on('end', function(){
            console.log(body.join(''));
        })
    });
    req.write(JSON.stringify(data));
    req.end();

}

И это называется просто:

logger({ 'test': 'datafoo' });

Так что мне любопытно, почему соединение отклонено / тайм-аут из-за этого исходящего https-запроса должен зависнуть, а затем завершить работу всего приложения.

Спасибо!

1 Ответ

0 голосов
/ 21 марта 2012

Программа зависает и ничего не печатает, потому что она не перехватывает данные, и вы не говорите процессу делать что-либо, кроме печати пустой строки с [].join('').Node.js не вернется без явного указания на задачи, связанные с IO.Вам необходимо передать и выполнить функцию обратного вызова или вызвать process.exit(); в обработчике для res.on("end", [handler]);, например:

res.on("end", function() {
    console.log(body.join(''));
    process.exit();
});

res.on("chunk", [handler]); не является стандартным событием HTTPS.Вы, вероятно, намеревались что-то вроде res.on("data", function(chunk) { body.push(chunk); });.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...