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