node.js中的异步https请求

时间:2012-02-24 05:43:35

标签: javascript node.js https

我有一个应用程序会触发对第三方服务的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 :(得分:0)

该程序挂起并打印任何内容,因为它没有捕获数据,并且您没有告诉进程除了使用[].join('')打印空字符串之外什么都不做。如果没有关于IO绑定任务的明确指令,Node.js将不会返回。您需要在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); });之类的东西。