首页 > 解决方案 > 当我有 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 })
            }
        });
    });
});

标签: node.jsmongoose

解决方案


发生这种情况是因为storedGame === gameTitle通过 forEach 循环多次变为真。您不能res.render在同一请求期间多次调用。

由于看起来您使用的是猫鼬,因此我建议您使用它Game.find来实际查找您要查找的内容,而不是从数据库中提取所有内容并自己处理搜索。

Games.find({title: gameTitle}, (err, games) => {
  // Return what you want to the client.
})

这仍然会导致返回多个游戏,因此您需要在响应客户端之前以某种方式处理它。

还要查看Promises,因为它们使代码看起来更干净。


推荐阅读