Время ожидания ответа Express.js
ПРОБЛЕМА
Я искал тайм-ауты запроса/ответа для Express.js, но все, кажется, связано с соединением, а не с самим запросом/ответом.
Если запрос занимает много времени, он должен быть отключен. Очевидно, это не должно произойти, но даже простая ошибка, связанная с обработкой маршрута без вызова обратного вызова или без res.send()
, браузер будет продолжать ждать ответа навсегда.
Пустой обработчик маршрута - прекрасный пример этого.
app.get('/sessions/', function(req, res, callback){});
FIX
Я добавил следующий до app.use(app,router);
и, похоже, добавил функцию таймаута. У кого-нибудь есть опыт/мнение по этому поводу?
app.use(function(req, res, next){
res.setTimeout(120000, function(){
console.log('Request has timed out.');
res.send(408);
});
next();
});
Обратите внимание, что я установил таймаут в 2 минуты.
Ответы
Ответ 1
Уже существует поддержка Connect Middleware for Timeout:
var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4
app.use(timeout(120000));
app.use(haltOnTimedout);
function haltOnTimedout(req, res, next){
if (!req.timedout) next();
}
Если вы планируете использовать промежуточное ПО Timeout как промежуточное ПО верхнего уровня, как указано выше, промежуточное программное обеспечение haltOnTimedOut
должно быть последним промежуточным программным обеспечением, определенным в стеке, и используется для обнаружения события таймаута. Спасибо @Aichholzer за обновление.
Боковое примечание:
Имейте в виду, что если вы откатываете свое собственное промежуточное ПО тайм-аута, коды состояния 4xx предназначены для клиентских ошибок, а 5xx - для ошибок сервера. 408s зарезервированы для:
Клиент не выдал запрос в течение времени, когда сервер был готов ждать. Клиент МОЖЕТ повторять запрос без каких-либо изменений в любое другое время.
Ответ 2
Обновление, если вы используете Express 4.2, затем удалило промежуточное ПО тайм-аута, поэтому нужно вручную добавить его с помощью
npm install connect-timeout
а в коде он должен быть
app.use(timeout('100s'));
Ответ 3
Перед настройкой маршрутов добавьте код:
app.all('*', function(req, res, next) {
setTimeout(function() {
next();
}, 120000); // 120 seconds
});