2017-02-17 32 views
1

Я кант в файл-запрос HTTPS, он хорошо работает 99,9% звонков, но иногда (может быть, когда сервер или сеть не доступна) висит на неопределенный срок ...Тайм-аут обработки с node.js поток трубопровода

Это, очевидно, заставляет мое приложение перестать работать и требует перезагрузки вручную ...

У меня есть другие 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!"); 
}); 

... но кажется, что таймауты в запросе игнорируются, если адресат передан в поток файлов, возможно, я должен обработать ошибку с тайм-аутом на объекте файловой системы, но документация не ясна, если есть событие I придется ждать, пока для «конца», за исключением ...

Вот пример кода, я надеюсь, что кто-то может помочь мне:

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

Я установил HTTP-сервер demo node.js, который отправляет очень медленный ответ и клиент, похожий на ваш пример кода.

Когда я начинаю клиент, а затем остановите сервер при отправке ответа, то я не получаю 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"); 
    }); 
}); 

`` `

Возможно, вы могли бы послушать это событие?

+0

Проблема заключается в том, что «конец» также испускался, когда tansfer заканчивается не только тогда, когда он прерывается или прерывается, мне нужен способ обнаружения ошибок. – gabry