发送后无法设置标头 - NodeJS

时间:2016-06-30 07:58:06

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

我有一个节点js app和我不断获得的路线之一"在发送错误后不能设置标题"。

路线的作用:

我的应用中的用户具有某些访问级别,因此此路由将通过用户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!")
                        });

                    }
                });

            }
        });
    }
}
});

非常感谢任何帮助。有谁知道我做错了什么?

3 个答案:

答案 0 :(得分: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!")
     }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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