使用node.js流传输处理超时问题

5

我将HTTPS请求输出到文件中,99.9%的请求都能正常工作,但偶尔会出现无限期挂起的情况(可能是因为服务器或网络不可用)...

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

我有其他HTTPS连接,它们以前也会偶尔挂起,现在使用以下请求对象上的错误代码总是成功完成,如Node文档所建议的:

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!");
});

... 但是如果将目标管道到文件流中,似乎请求的超时时间被忽略了,也许我应该在文件系统对象上处理一个带有超时的错误,但是文档没有明确说明是否有除'finish'之外的事件需要等待...

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

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个回答

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");
    });
 });

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


2
问题是'end'在传输结束时也被发出,而不仅仅是在被中断或超时时,我需要一种检测错误的方法。 - gabry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接