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

gab*_*bry 5 error-handling timeout pipe stream node.js

我正在向文件传输 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!");
});
Run Code Online (Sandbox Code Playgroud)

...但如果目标通过管道传输到文件流,则似乎请求的超时被忽略,也许我应该处理文件系统对象上的超时错误,但文档不清楚是否有一个事件除了“完成”之外等待...

这是示例代码,希望有人能帮助我:

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();
Run Code Online (Sandbox Code Playgroud)

如果您想尝试挂起,使用大文件更改主机路径并在传输过程中断开网络电缆,它应该在 10 秒后超时,但它不会...

Mar*_*arc 2

我设置了一个演示 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");
    });
 });
Run Code Online (Sandbox Code Playgroud)

````

也许你可以听听那个活动?

  • 问题是,当传输结束时,“end”也会发出,而不仅仅是在传输中断或超时时,我需要一种方法来检测错误。 (2认同)