mongoose - 设置标头两次和/或未正确处理回调 - 导致错误 [ERR_HTTP_HEADERS_SENT]
问题描述
我用这段代码得到了预期的图像,但它没有显示在我的 pug 模板中,而是显示在浏览器 devtools 控制台中(我希望这是有道理的),而且似乎我正在尝试设置标题两次。我的代码产生 [ERR_HTTP_HEADERS_SENT] 如下所示。
我已经阅读了许多有关此问题的 StackOverflow 问题,包括对问题的彻底细分:
我认为实际发生的是我没有正确处理回调,但我不确定。
我真的很挣扎,可以使用一点帮助来指出我哪里出错了。
路由.js:
router.get('/issue/filedisplay/:id', issue_controller.file_display);
控制器.js:
// controller.js
exports.file_display = function(req, res) {
gfs.files.findOne(
{ _id: mongoose.Types.ObjectId(req.params.id) },
(err, file) => {
//res.contentType(file.contentType);
// Check if file
if (!file || file.length === 0) {
return res.status(404).json({
err: 'No file exists',
});
}
const readstream = gfs.createReadStream(file._id);
readstream.pipe(res);
readstream.on('close', () => {
res.render('filedisplay', {
title: 'Display Image',
file: file._id,
});
});
//return res.json(file);
//return res;
}
);
};
帕格模板:
//-filedisplay.pug
extends layout
block content
h1= title
p Display Image
div
img.image(src="/list/issue/filedisplay/" + file alt="")
错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:482:11)
at ServerResponse.header (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:170:12)
at done (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:1008:10)
at Object.exports.renderFile (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/pug/lib/index.js:421:12)
at View.exports.__express [as engine] (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/pug/lib/index.js:464:11)
at View.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/view.js:135:8)
at tryRender (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/application.js:640:10)
at Function.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/application.js:592:3)
at ServerResponse.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:1012:7)
at /home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/app.js:82:7
at Layer.handle_error (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/layer.js:71:5)
at trim_prefix (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:315:13)
at /home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:335:12)
at next (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:275:10)
解决方案
此问题已关闭。它没有解决,代码仍然被破坏。在上面的控制器代码中,我真正需要的只是:
readstream.pipe(res);
之所以可行,是因为我在引用链接中添加了 target="_blank",导致渲染图像在新的浏览器窗口中打开,这正是我真正想要的。因此,在新的哈巴狗模板中渲染图像是一个不必要的步骤,正是在“on”方法中渲染代码导致了问题。
推荐阅读
- c - Unisys 最新的大型机系统是否仍然使用反码表示?
- c - Effective type rules with relation to strict aliasing
- javascript - how do I run code after the last element has completed its jQuery slideup effect?
- html - 如何在 ruby on rails 的 2 个字符串之间插入和变量
- arrays - 无法访问 AWS Athena 中的数组元素
- json - 带有 JSON ObservedObject 的 SwiftUI
- python - Python OpenCV 无法识别我的第二个网络摄像头 [已关闭]
- mysql - MySQL Multiple SELECT 与 WHERE 一起使用
- c# - 在 C# 中使用 FsCheck.Xunit 调整字符串生成器以避免“\0”
- ios - 如何使 navigationItem.backbarbuttonitem 与前一个视图的 navigationItem 的标题不同?