gpt4 book ai didi

javascript - 表达静态和setHeaders : "Error: Can' t set headers after they are sent.“

转载 作者:行者123 更新时间:2023-11-30 20:57:30 26 4
gpt4 key购买 nike

我收到错误 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');
},
}));

一切正常,我没有收到任何错误。希望在这个问题上得到一些帮助。

编辑:当我打开 Chrome devtools 的“禁用缓存”时,错误消失了。当我将其关闭时,错误又回来了。

最佳答案

这是因为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,比较 E-Tag,在这种情况下返回 304。这应该可以解释为什么打开 Disable Cache,错误不会出现。当客户端已经在缓存中获取对象时,路径是不同的,而当它没有时,路径是不同的。

关于javascript - 表达静态和setHeaders : "Error: Can' t set headers after they are sent.“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com