我有一个应用程序可以向第 3 方服务发出 https 请求以执行日志记录。出于某种原因,我几个小时前注意到第 3 方拒绝连接。不过那是另一个话题。
我在我的 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 请求的连接被拒绝/超时应该挂起然后崩溃整个应用程序。
谢谢!
最佳答案
程序挂起并且不打印任何内容,因为它没有捕获数据,并且除了使用 [].join('')
打印一个空字符串之外,您没有告诉进程执行任何操作。如果没有关于 IO 绑定(bind)任务的明确说明,Node.js 不会返回。你需要在res.on("end", [handler]);
的handler中传入并执行一个回调函数,或者调用process.exit();
>,例如:
res.on("end", function() { console.log(body.join('')); process.exit(); });
res.on("chunk", [handler]);
不是标准的 HTTPS 事件。您可能想要像 res.on("data", function(chunk) { body.push(chunk); });
这样的东西。
关于javascript - node.js 中的异步 https 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9425995/