Javascript 错误:Can';t在发送后设置标头-正确处理express控制器中的错误
我对下面的代码有问题。命中错误时,将命中if语句并调用res.send。但是,代码随后继续执行下面的res.json调用。这将导致标头错误 使用else语句是唯一正确的方法吗?我假设调用res.send会中断函数Javascript 错误:Can';t在发送后设置标头-正确处理express控制器中的错误,javascript,node.js,express,Javascript,Node.js,Express,我对下面的代码有问题。命中错误时,将命中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;
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响应)调用
res.end
后无法发送响应,这是在调用res.send
函数时由express在内部完成的
在您的情况下,只要在出现错误时添加return
if (err) {
return res.status(400).send(err);
}
调用
res.end
后无法发送响应,这是在调用res.send
函数时由express在内部完成的
在您的情况下,只要在出现错误时添加return
if (err) {
return res.status(400).send(err);
}
因为在发送状态的错误情况下不会返回,所以下面的代码无论如何都会在错误之后执行 您需要编写:
返回res.status(400).send(err)代码>
或者只需使用if-else
,因为在发送状态的错误情况下不会返回,所以下面的代码只会在之后执行
您需要编写:返回res.status(400).send(err)代码>
或者只需使用,如果else
您对res()的假设不正确。send()
中断,则只有在您返回
时才会执行此操作。如果出现错误,请调用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使用函数(req,res,next)
将中间件链接在一起,并且可以通过多个中间件中的res.send()
返回结果。当您返回下一个()
时,会调用链中的下一个中间件,因此,如果您希望在成功时在另一个中间件中返回其他数据,则不会返回res.send()
,而是在res.send()
之后调用返回下一个()
,您对res.send()的假设是不正确的
breaking,只有当您返回时它才会这样做。如果出现错误,请调用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使用函数(req,res,next)
将中间件链接在一起,并且可以通过多个中间件中的res.send()
返回结果。当您返回下一个()
时,会调用链中的下一个中间件,因此,如果您希望在成功时在另一个中间件中返回其他数据,则不会返回res.send()
,而是在res.send()之后调用返回下一个()
您得到的错误是因为代码行
res.status(200).json({
message: 'Team successfully created',
team: team
});
无论是否出错,都将调用。如果出现错误,express已在此代码中发送响应标头
if (err) {
res.status(400).send(err);
}
因此,当express尝试下面的代码时,它会得到您表示的错误。答案是使用Rami Jarrar提供的答案
// 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
});
});
您得到的错误是因为代码行
res.status(200).json({
message: 'Team successfully created',
team: team
});
无论是否出错,都将调用。如果出现错误,express已在此代码中发送响应标头
if (err) {
res.status(400).send(err);
}
因此,当express尝试下面的代码时,它会得到您表示的错误。答案是使用Rami Jarrar提供的答案
// 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
});
});
请尝试以下方法:
team.save(function (err) {
if (err) {
return res.status(400).send(err); // here i have added a return
}
res.status(200).json({
message: 'Team successfully created',
team: team
});
}
问题是,当我们向客户端发送响应时,tcp连接将关闭,再次在同一响应对象上发送数据将抛出当前代码中的错误。请尝试以下操作:
team.save(function (err) {
if (err) {
return res.status(400).send(err); // here i have added a return
}
res.status(200).json({
message: 'Team successfully created',
team: team
});
}
问题是,当我们将响应发送到客户端时,tcp连接将关闭,再次在同一响应对象上发送数据将抛出当前代码中的错误。res.send()
不会中断,express使用传递到中间件的next()
将中间件处理程序链接在一起(req,res,next)
。可以从多个处理程序调用res.send()
,这可能就是您的情况。实际上,您可能出现了一个错误,然后尝试设置标题/状态。res.send()
不会中断,请使用next()将中间件处理程序快速链接在一起
传递给中间件(req,res,next)
。可以从多个处理程序调用res.send()
,这可能就是您的情况。实际上,您可能出现错误,然后尝试设置标头/状态。