使用node.js流管道进行超时处理

时间:2017-02-17 15:22:24

标签: node.js error-handling stream timeout pipe

我正在向一个文件管道输入一个HTTPS请求,它可以正常工作99.9%,但偶尔(可能在服务器或网络不可用时)无限期挂起......

这显然导致我的应用程序停止工作并需要手动重启...

根据节点文档的建议,我还有其他的https连接,这些连接偶尔会挂起并始终使用请求对象上的以下错误代码完成:

request.on('socket', function(socket) {
    socket.setTimeout(10000);
    socket.on('timeout', function() { request.abort(); });
});

request.on('error', function(e) {
   // Handle the error...
   console.error("FAILED!");
});

...但是如果目标通过管道传输到文件流,似乎会忽略请求的超时,也许我应该处理文件系统对象超时的错误,但是文档不清楚是否存在事件我必须等待,除了“完成' ...

以下是示例代码,希望有人可以帮助我:

var https = require('https'),
    fs = require('fs');

var opts = {
        host: 'www.google.com',
        path: '/',
        method: 'GET',
        port: 443
};

var file = fs.createWriteStream('test.html');

var request = https.request(opts, function(response) {
    response.pipe(file);
    file.on('finish', function() {
        file.close(function(){
            console.log("OK!");
        });
    });
 });

request.on('socket', function(socket) {
    socket.setTimeout(10000);
    socket.on('timeout', function() { request.abort(); });
});

request.on('error', function(e) {
  console.error("FAILED!");
});

request.end();

如果你想尝试挂起,用一个巨大的文件更改主机路径并在传输过程中断开网线,它应该会在10秒后超时,但是它没有......

1 个答案:

答案 0 :(得分:1)

我设置了一个demo node.js http服务器,它发送一个非常慢的答案和一个类似于你的示例代码的客户端。

当我启动客户端然后在发送响应时停止服务器时,我也没有在套接字上获得timeout事件,但我在响应中收到end事件客户:

var request = https.request(opts, function(response) {
    response.pipe(file);
    file.on('finish', function() {
        file.close(function(){
           console.log("OK!");
        });
    });
    response.on('end', function() {
       // this is printed when I stop the server
       console.log("response ended");
    });
 });

```

也许你可以听听那个事件?