【问题标题】:Can't Set Headers After they are sent - NodeJS发送后无法设置标头-NodeJS
【发布时间】:2016-06-30 07:58:06
【问题描述】:

我有一个节点 js 应用程序和一个我不断收到“发送错误后无法设置标头”的路由。

路线的作用:

我的应用程序中的用户具有特定的访问级别,因此此路由通过 users accessLevel 数组并找到此路由的适当访问级别。并且根据调用路由的用户的访问级别,它会执行不同的操作。

守则:

app.post('/bios/approve', isLoggedIn, function(req, res) {

for (var i = 0; i < req.user.accessLevel.length; i++) {
    if (req.user.accessLevel[i] === "Bio Officer") {

        Bio.findOneAndUpdate({userID: req.body.userID, bioForSector: req.body.bioForSector}, {
            background: req.body.background,
            experience: req.body.experience,
            skills: req.body.skills,
            bioStatus: req.body.bioStatus
        }, function(err, editedBio) {

            if (err)
                console.log("Error while editing Pending Bio is " + err);

            else if (editedBio) {
                User.findOneAndUpdate({accessLevel: "Bio Designer"}, {
                    $push: {biosPending: editedBio._id}
                }, function(err, user) {

                    if (err) {
                        console.log("The error while finding lineManager is " + err);
                    } else if (user) {User.findOneAndUpdate({accessLevel: "Bio Officer"}, {
                            $pull: {
                                biosPending: editedBio._id
                            }
                        }, function(err, bioOfficer) {
                            if (err) {
                                console.log("The error while finding lineManager is " + err);
                            }
                            res.json("Bio Done!")
                        });

                    }
                });

            }

        });

    } else if (req.user.accessLevel[i] === "Bio Designer") {
        // Currently Empty

    } else {

        Bio.findOneAndUpdate({userID: req.body.userID,bioForSector: req.body.bioForSector}, {
            background: req.body.background,
            experience: req.body.experience,
            skills: req.body.skills,
            bioStatus: req.body.bioStatus
        }, function(err, editedBio) {

            if (err)
                console.log("Error while editing Pending Bio is " + err);

            else if (editedBio) {
                User.findOneAndUpdate({accessLevel: "Bio Officer"}, {$push: {biosPending: editedBio._id}
                }, function(err, user) {

                    if (err) {
                        console.log("The error while finding lineManager is " + err);
                    } else if (user) {

                        User.findOneAndUpdate({email: editedBio.lineManagerEmail}, {$pull: {biosPending: editedBio._id}
                        }, function(err, bioOfficer) {

                            if (err) {
                                console.log("The error while finding lineManager is " + err);
                            }
                            res.json("bio Done!")
                        });

                    }
                });

            }
        });
    }
}
});

任何帮助将不胜感激。有谁知道我做错了什么?

【问题讨论】:

  • 你能先清除那个CB地狱吗?这很难读...
  • 交叉检查你的 isLoggedIn 函数,你不是在那里发送资源

标签: javascript node.js http express http-headers


【解决方案1】:
Can't Set Headers After they are sent

表示您针对单个请求多次发送响应。

从你的代码我可以建议的是:

for (var i = 0; i < req.user.accessLevel.length; i++) {
     if(--req.user.accessLevel.length == 0){
        res.json("Bio Done!")
     }
}

【讨论】:

  • 感谢您的回答。 accessLevel 的长度永远不会是 0。每个用户都至少有一个 accessLevel。我的代码中有两次 res.json,但它位于 if 语句的不同部分。
【解决方案2】:

首先尝试添加 res.End();在 res.json() 之后。 如果这不起作用,您可以添加'isLoggedIn'的代码吗?

【讨论】:

    【解决方案3】:

    每次发回回复时,您也应该使用return 字样。 您想返回以确保在该行执行后没有代码,并意外再次发送另一个响应。

    例如:return res.json("bio Done!")

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2017-12-22
      • 2018-09-02
      • 2023-04-01
      相关资源
      最近更新 更多