我对下面的代码有一个问题。当命中错误时,将命中if语句并调用res.send。但是,代码随后继续执行下面的res.json调用。这会导致报头错误。
使用else语句是唯一正确的方法吗?我假设调用res.send会中断函数。
exports.new = function (req, res) {
let team = new Team();
team.name = req.body.name;
team.description = req.body.description;
team.members = [];
// save the team and check for errors
team.save(function (err) {
if (err) {
res.status(400).send(err);
}
res.status(200).json({
message: 'Team successfully created',
team: team
});
});
};
我还尝试使用req,res,next作为函数参数,并使用以下方法:
if (err) {
res.status(400);
next(err);
}
res.status(200).json({
message: 'Team successfully created',
team: team
});
虽然这不会抛出错误,但它仍然继续调用最终的res.status.json (结果是200,而不是400 )
发布于 2019-06-03 00:32:18
不能在调用res.end
之后发送响应,这是在调用res.send
函数时由express在内部完成的
在本例中,只需在出现错误时添加return
if (err) {
return res.status(400).send(err);
}
发布于 2019-06-03 00:33:23
因为在发送状态的错误情况下不会返回,所以下面的代码只是在之后执行。
你需要写:return res.status(400).send(err);
或者直接使用if else
发布于 2019-06-03 00:33:23
你关于res.send()
破坏的假设是不正确的,只有当你return
的时候它才会这样做。在发生错误的情况下调用res.send()
上的return
,这样它就不会继续执行。如果你得到一个错误,它会将状态设置为400 (在标题中),然后主体中的错误,但因为它不返回它,然后尝试将状态设置为200 (在标题中),从而导致您看到的错误。
// save the team and check for errors
team.save(function (err) {
if (err) {
// return here so that it will not continue!
return res.status(400).send(err);
}
// return here if there is no error!
return res.status(200).json({
message: 'Team successfully created',
team: team
});
});
Express使用function(req, res, next)
将中间件链接在一起,并且可以在多个中间件中通过res.send()
返回结果。链中的下一个中间件在您成功执行return next()
时被调用,因此,例如,如果您希望在成功时在另一个中间件中返回额外的数据,则不会执行return res.send()
,而是在res.send()
之后调用return next()
。
https://stackoverflow.com/questions/56416862
复制相似问题