Express Static и setHeaders: «Ошибка: невозможно установить заголовки после их отправки».

1

Я получаю сообщение об ошибке Error: Can't set headers after they are sent. удается Error: Can't set headers after they are sent. со следующим кодом.

app.use('/assets/u', express.static('./public/img/u', {
  setHeaders: (res, path, stat) => {
    redis.get('image-mime:1', (err, reply) => {
      if (err) console.log(err);
      res.set('Content-Type', reply);
    });
  },
}));

Я думаю, что это как-то связано с обратным вызовом? Поскольку я удаляю обратный вызов следующим образом:

app.use('/assets/u', express.static('./public/img/u', {
  setHeaders: (res, path, stat) => {
    res.set('Content-Type', 'image/png');
  },
}));

все работает так, как должно, и я не получаю ошибок. Хотелось бы помочь в решении этой проблемы.

Edit: Когда я включаю Devtools Chrome „Отключить кэш“, ошибка исчезает. И в тот момент я отключить его, то ошибка возвращается.

Теги:
express

1 ответ

1
Лучший ответ

Это связано с тем, что setHeaders() нужно запускать синхронно. Решение состоит в обратном вызове:

app.use('/assets/u', (res, res, next) => {
  redis.get('image-mime:1', (err, reply) => {
    if (err) return next(err);
    res.set('Content-Type', reply);
    next();
  });
}, express.static('./public/img/u'));

Первое промежуточное ПО извлекает тип mime и вызовы служат статическими только тогда, когда это происходит, если не произойдет ошибка.

Имейте в виду, что он будет называть redis, даже если клиент уже имеет последнюю копию объекта, сравнивая электронные теги, в этом случае возвращается 304. Это должно объяснить, почему включение Disable Cache, ошибка не появляется. Существует другой путь, когда клиент получил объект уже в кеше, а когда нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню