Node сервер, сокет, тайм-ауты запроса и ответа
Проблема
Node запросы на тайм-аут конфигурации по умолчанию через 2 минуты. Я хотел бы изменить таймауты запроса:
- 1 минута для "обычных" запросов
- 5 минут для запросов, которые обслуживают статические файлы (в этом случае большие активы)
- 8 часов для загрузки (пару тысяч снимков за запрос)
Исследование
Чтение через Node документация, я обнаружил, что существует множество способов определения тайм-аутов.
Я использую Express, который также предоставляет промежуточное программное обеспечение для определения тайм-аута для (конкретных) маршрутов. Я пробовал это, без успеха.
Вопрос
Я смущен тем, как правильно настроить лимит времени ожидания по всему миру и по маршруту. Должен ли я настраивать все указанные выше тайм-ауты? Как настроить тайм-аут сервера по-разному для установки времени ожидания сокета или запроса?
Ответы
Ответ 1
Как я увидел на ваш другой вопрос, касающийся использования промежуточного программного обеспечения тайм-аута, вы используете его как-то иначе.
См. документацию промежуточное программное обеспечение timeout-connect.
Добавьте вашу ошибкуHandler-функцию как EventListener в запрос, так как это EventEmitter и промежуточное программное обеспечение заставляет его испускать timeout
-event:
req.on("timeout", function (evt) {
if (req.timedout) {
if (!res.headersSent) {
res
.status(408)
.send({
success: true,
message: 'Timeout error'
});
}
}
});
Это вызвано вне стека промежуточного программного обеспечения, в результате чего вызов функции next(err)
будет недействительным. Кроме того, вы должны иметь в виду, что если тайм-аут произойдет, когда запрос висит на стороне сервера, вам необходимо предотвратить код вашего сервера от дальнейшей обработки этого запроса (поскольку заголовки уже отправлены и его базовое соединение больше не будет доступно).
Ответ 2
Резюме
- nodejs timeout API - это таймаут бездействия
- expressjs/timeout пакет - это ответ жесткого тайм-аута
nodejs timeout API
server.timeout
- неактивность/время ожидания
- равный тайм-ауту сокета
- default 2min
server.setTimeout
- неактивность/время ожидания
- равный тайм-ауту сокета
- default 2min
- имеют обратный вызов
socket.setTimeout
- неактивность/время ожидания
- callback ответственный за конец(), destroy() socket
- default no timeout
response.setTimeout
- socket.setTimeout front end
request.setTimeout
- socket.setTimeout front end
expressjs/пакет времени ожидания
- ответ жесткого таймаута (против бездействия)
- имеют обратный вызов
Заключение
- макс. время, требуемое для действия (запрос + ответ), необходим пакет express/timeout.
Это правильно, что вам нужно, но обратный вызов должен завершить запрос/ответ. Поскольку тайм-аут вызывает только обратный вызов, он не изменяет состояние или не мешает соединению. Это задача обратного вызова.
- idle timeout, задайте время ожидания запроса/ответа nodejs api
Я не рекомендую прикасаться к ним, так как в большинстве случаев это не обязательно. Если вы не хотите разрешать соединение с простоя (без трафика) более 2 минут.
Ответ 3
Уже существует поддержка Connect Middleware for Timeout. Вы можете попробовать это промежуточное программное обеспечение.
var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4
app.use(timeout(120000)); // should be changed with your desire time
app.use(haltOnTimedout);
function haltOnTimedout(req, res, next){
if (!req.timedout) next();
}