错误:发送后无法设置标头

时间:2016-05-03 01:36:53

标签: node.js express

我想发送res.redirect()的参数。但是,我在运行时遇到错误,说我发送后无法设置标头。

这是什么意思,我该如何解决?

app.post('/updateCollaborateRequest', function(req,res) {
    if(req.body.accept == true) {
        Team.findOne({'name': req.body.data.teamName}, function (err, team) {
            if(err) {
                res.redirect('/explore');
            }
            team.accepted = true;
            team.save(function (err) {
                if (err) {
                    alert(err);
                }
                Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
                    request.seen = true;
                    request.save(function(err) {
                        if(err) {
                            console.log(err);
                        }
                    });
                });
                res.redirect("/teamprof/" + team.name);
            });
        });
    }
    Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
        request.seen = true;
        request.save(function(err) {
            if(err) {
                console.log(err);
            }
            res.render('userprof1', {message : req.flash('done')});
        });
    });
});

2 个答案:

答案 0 :(得分:1)

重定向后,您的代码仍在继续。这可能就是问题所在。您应该返回,否则您将继续尝试写入HTTP响应。

答案 1 :(得分:1)

此特定错误消息是由导致多次res.xxx()调用的代码路径引起的,这些调用尝试多次发送响应。

你有多个地方在做这件事。例如,您在res.redirect()回调中有两个Team.findOne()来电,但接着Request.findOne()继续res.render()。您必须确保只发送一次响应。

我并不完全确定在所有情况下所需的逻辑是什么,但您可以通过在else之前添加Request.findOne()语句并在每个之后添加return来修复该错误res.redirect()。如果这不是您想要的确切流程,请详细说明您希望控制流如何工作。这是应用了这些更改的代码:

app.post('/updateCollaborateRequest', function(req,res) {
    if(req.body.accept == true) {
        Team.findOne({'name': req.body.data.teamName}, function (err, team) {
            if(err) {
                res.redirect('/explore');
                return;
            }
            team.accepted = true;
            team.save(function (err) {
                if (err) {
                    // FIXME: need error handling here
                    alert(err);
                }
                Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
                    request.seen = true;
                    request.save(function(err) {
                        if(err) {
                            // FIXME: need error handling here
                            console.log(err);
                        }
                    });
                });
                // Are you sure you want to send this response before
                // you even know if the `Request.findOne()` and `request.save()` 
                // have been sucessful?
                res.redirect("/teamprof/" + team.name);
                return;
            });
        });
    } else {
        Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
            request.seen = true;
            request.save(function(err) {
                if(err) {
                    console.log(err);
                }
                res.render('userprof1', {message : req.flash('done')});
            });
        });
    }
});    

您仍然有几个错误条件,没有响应发送,这是不完整的错误处理,所以那些也需要修复。而且,我在代码中添加了一些关于代码中其他可疑内容的注释。