Подтвердить что ты не робот

Время ожидания ответа 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 минуты.

4b9b3361

Ответ 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
});