Я получаю сообщение об ошибке 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 „Отключить кэш“, ошибка исчезает. И в тот момент я отключить его, то ошибка возвращается.
Это связано с тем, что 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
, ошибка не появляется. Существует другой путь, когда клиент получил объект уже в кеше, а когда нет.