node.js - 当我有 2 个名称相似的条目时出现错误
问题描述
当我有两个标题相同的类似帖子时,我会收到此错误。当我访问具有相同名称的页面时出现错误,具有不同名称的其他条目可以正常工作。
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\response.js:767:10)
at ServerResponse.send (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\response.js:170:12)
at done (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\response.js:1004:10)
at tryHandleCache (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\ejs\lib\ejs.js:257:5)
at View.exports.renderFile [as engine] (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\ejs\lib\ejs.js:482:10)
at View.render (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\view.js:135:8)
at tryRender (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\application.js:640:10)
at Function.render (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\express\lib\response.js:1008:7)
at games.forEach.game (D:\DD\documents\100dc\nodejs\gamesplayed\app.js:80:21)
at Array.forEach (<anonymous>)
at Game.find (D:\DD\documents\100dc\nodejs\gamesplayed\app.js:77:15)
at D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\mongoose\lib\model.js:4759:16
at D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\mongoose\lib\query.js:4099:12
at process.nextTick (D:\DD\documents\100dc\nodejs\gamesplayed\node_modules\mongoose\lib\helpers\query\completeMany.js:35:39)
app.post('/newentry', (req, res)=> {
const gameName = req.body.gameName;
const gameImage = req.body.gameImage;
const gamedesc = req.body.gamedesc;
const gameEntry = new Game({title: gameName, description: gamedesc, image: gameImage});
gameEntry.save();
res.redirect('/');
});
app.get('/:title', (req, res) => {
const gameTitle = _.lowerCase(req.params.title);
Game.find((err, games)=> {
games.forEach(game => {
const storedGame = _.lowerCase(game.title);
if (storedGame === gameTitle) {
res.render('post', {title: game.title, image: game.image, desc: game.description, id: game._id })
}
});
});
});
解决方案
发生这种情况是因为storedGame === gameTitle
通过 forEach 循环多次变为真。您不能res.render
在同一请求期间多次调用。
由于看起来您使用的是猫鼬,因此我建议您使用它Game.find
来实际查找您要查找的内容,而不是从数据库中提取所有内容并自己处理搜索。
Games.find({title: gameTitle}, (err, games) => {
// Return what you want to the client.
})
这仍然会导致返回多个游戏,因此您需要在响应客户端之前以某种方式处理它。
还要查看Promises,因为它们使代码看起来更干净。
推荐阅读
- json - 这是名为 'abc' 的 json 文件。我想访问文件之后我想访问 a,b,c,d,e,f 的值。如何以 groovy 语言访问?
- crystal-reports - 水晶报表:如何将子报表组中的总金额按货币带入主报表?以及如何按货币计算总和?
- java - 将用户分配到会议。字符串与集合类型不匹配的问题
- python - CatBoostClassifier 静态特征顺序
- rust - 实现迭代器特征时如何修复生命周期不匹配?
- android - 我无法设置 Safe Args 默认值
- gpu - 如何使用 icc 编译 gpu 卸载代码
- java - 胶水作业失败,随机出现“未找到 JohnSnowLabs spark-nlp 依赖项”错误
- python - 如何保存经过训练的神经网络的权重和偏差
- flutter - Flutter DeviceApps.openApp 在某些 android 设备上工作,但在其他一些设备上不工作