Why do I get "Error: Can't set headers after they are sent" despite sending a status code?
Why do I get "Error: Can't set headers after they are sent" despite sending a status code?
这是我的代码:
app.post('/register', function(req, res){
var user = new User(req.body);
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
User.findOne({
username: req.body.username
}, function(err, userr){
if(err) {res.status(400).send(err); }
if (userr){res.status(400).send('error: user already exists'); }
user.save(function(err, user){
if (err){ res.status(400).send('couldn\tt save fo sum rezon'); }
if (user) { res.send(user); }
});
});
});
这是我的错误:
home/michael/passport-local-implementation/node_modules/mongoose/node_modules/mpromise/lib/promise.js:108
if (this.ended && !this.hasRejectListeners()) throw reason;
^
Error: Can't set headers after they are sent.
我对不止一次发送 headers 的地方感到困惑?这段代码不应该在满足其中一个条件时立即停止执行,或者如果满足 none,则只呈现用户?
如果有人能给我资源,告诉我在哪里可以阅读有关快速路由工作原理的详细信息,我将加分!
以下面一行为例:
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
如果满足条件,express 将发送响应,但函数不会 return,因此将评估下一行等等..
您应该简单地添加一个 return;
以确保函数 return 如果已发送响应。
这是奖励积分;) express routing
更新:
如果您不使用 else
,则应始终使用 return
:
...
var user = new User(req.body);
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
else if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
else { // include the rest of your function code here... }
这样,您的其余代码只会在 if
都失败的情况下进行评估..
添加到 john's answer
如果在你的例子中:
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
如果 req.body.password.length
小于或等于 3.
两个条件都满足,首先if
express发送响应,然后当第二个条件满足时,它再次尝试发送响应。但是这些是响应,因此它的 headers 已经发送(如错误所述)。
快速发送方法包括以下任务:
- 设置headers
- 设置响应body
- 结束回复(res.end)
因此 res.send
也 结束 响应,因此您将无法在发送响应后发送响应。
你可以选择像这样发送回复
if (req.body.password.length <= 5){
res.status(400).send('error: password must be longer');
} else if (req.body.username.length <= 3){
res.status(400).send('error: username must be longer');
}
这是我的代码:
app.post('/register', function(req, res){
var user = new User(req.body);
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
User.findOne({
username: req.body.username
}, function(err, userr){
if(err) {res.status(400).send(err); }
if (userr){res.status(400).send('error: user already exists'); }
user.save(function(err, user){
if (err){ res.status(400).send('couldn\tt save fo sum rezon'); }
if (user) { res.send(user); }
});
});
});
这是我的错误:
home/michael/passport-local-implementation/node_modules/mongoose/node_modules/mpromise/lib/promise.js:108
if (this.ended && !this.hasRejectListeners()) throw reason;
^
Error: Can't set headers after they are sent.
我对不止一次发送 headers 的地方感到困惑?这段代码不应该在满足其中一个条件时立即停止执行,或者如果满足 none,则只呈现用户?
如果有人能给我资源,告诉我在哪里可以阅读有关快速路由工作原理的详细信息,我将加分!
以下面一行为例:
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
如果满足条件,express 将发送响应,但函数不会 return,因此将评估下一行等等..
您应该简单地添加一个 return;
以确保函数 return 如果已发送响应。
这是奖励积分;) express routing
更新:
如果您不使用 else
,则应始终使用 return
:
...
var user = new User(req.body);
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
else if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
else { // include the rest of your function code here... }
这样,您的其余代码只会在 if
都失败的情况下进行评估..
添加到 john's answer
如果在你的例子中:
if (req.body.password.length <= 5){ res.status(400).send('error: password must be longer'); }
if (req.body.username.length <= 3){ res.status(400).send('error: username must be longer'); }
如果 req.body.password.length
小于或等于 3.
两个条件都满足,首先if
express发送响应,然后当第二个条件满足时,它再次尝试发送响应。但是这些是响应,因此它的 headers 已经发送(如错误所述)。
快速发送方法包括以下任务:
- 设置headers
- 设置响应body
- 结束回复(res.end)
因此 res.send
也 结束 响应,因此您将无法在发送响应后发送响应。
你可以选择像这样发送回复
if (req.body.password.length <= 5){
res.status(400).send('error: password must be longer');
} else if (req.body.username.length <= 3){
res.status(400).send('error: username must be longer');
}