Сбой экспресс-журнала при использовании express.static - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время я пытаюсь зарегистрировать полный конечный ответ на каждый запрос Express с помощью простой функции промежуточного программного обеспечения, например:

module.exports = (req, res, next) => {
    const startTime = new Date();
    const oldEnd = res.end;

    res.end = (chunks, encoding) => {
        const responseTime = new Date() - startTime;
        res.set('Server-Timing', `total;dur=${responseTime}`);
        console.log(req.path, `Response Time: ${responseTime}`);
        res.end = oldEnd;
        res.end(chunks, encoding);
    };

    next();
}

Этот код отлично работает с обычными конечными точками Express, но когда я пытаюсь обслуживатьстатический файл, подобный этому: app.use('/static/path', express.static('path')) Я получаю следующую ошибку:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Это происходит из-за res.set для синхронизации сервера, но это означает, что express.static использует .end() дважды?Когда я console.log в своей функции промежуточного программного обеспечения, она вызывается только один раз.

Я использую NodeJS 10 и Express 4.16.4

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 21 декабря 2018

res.end не вызывается дважды.

serve-static передает файл клиенту, и когда первый фрагмент файла записывается в поток, заголовки отправляются.Из документов nodejs:

response.writeHead

Если response.write () или response.end () были вызваны ранееПри вызове этого неявные / изменяемые заголовки будут вычислены и вызовут эту функцию.

Поэтому невозможно установить заголовки после того, как поток начал отправлять данные клиенту.Но можно передать функцию setHeader в параметрах статического обслуживания.

express.static('./public', {
  setHeaders: (res, path, stat) => {
    const responseTime = new Date() - res.locals.startTime;
    res.set('Server-Timing', `total;dur=${responseTime}`);
  },
});

Однако, поскольку заголовки отправляются в начале пара, это не точное время отклика.Больше времени отклика только для заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...