错误 [ERR_HTTP_HEADERS_SENT] 发送给客户端后无法设置 headers
Error [ERR_HTTP_HEADERS_SENT] Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (C:\root\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\root\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\root\node_modules\express\lib\response.js:267:15)
at ServerResponse.send (C:\root\node_modules\express\lib\response.js:158:21)
at grade.save (C:\root\route\api\listsData.js:223:32)
at C:\root\node_modules\mongoose\lib\model.js:4604:16
at C:\root\node_modules\mongoose\lib\utils.js:268:11
at $__save.error (C:\root\node_modules\mongoose\lib\model.js:472:16)
at C:\root\node_modules\kareem\index.js:246:48
at next (C:\root\node_modules\kareem\index.js:167:27)
at next (C:\root\node_modules\kareem\index.js:169:9)
at Kareem.execPost (C:\root\node_modules\kareem\index.js:217:3)
at _handleWrapError (C:\root\node_modules\kareem\index.js:245:21)
at C:\root\node_modules\kareem\index.js:272:14
at _next (C:\root\node_modules\kareem\index.js:94:14)
Emitted 'error' event at:
请帮忙,我已经面临这个问题将近 3 天了,下面是我的后端 nodejs 代码:
等级模型
const mongoose = require('mongoose');
const GradeSchema = new mongoose.Schema({
name: {
type: String,
maxlength: 100,
required: true,
unique: true
}
})
module.exports = Grade = mongoose.model('Grade', GradeSchema);
添加等级路线
'/add/grade',
[
check('name', 'grade name is require')
.not()
.isEmpty()
],
auth,
admin,
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) res.status(400).send({ errors: errors.array() });
const grade = new Grade(req.body);
grade.save((err, doc) => {
if (err) res.status(400).send({ success: false, err });
return res.status(200).send({
success: true,
grade: doc,
msg: 'Grade add successfully'
});
});
}
);
问题是当我尝试使用 post 请求添加成绩时它工作正常,但如果我输入空白字段并再次发送请求,应用程序崩溃并且它 returns 'Cannot set headers after they are sent to the client' 以上的错误。谢谢。
一旦发生错误,您需要return您的错误响应,否则您的函数将保持运行并在错误发生后执行以下代码。
'/add/grade',
[
check('name', 'grade name is require')
.not()
.isEmpty()
],
auth,
admin,
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).send({ errors: errors.array() });
const grade = new Grade(req.body);
grade.save((err, doc) => {
if (err) return res.status(400).send({ success: false, err });
return res.status(200).send({
success: true,
grade: doc,
msg: 'Grade add successfully'
});
});
}
);
因为如果发生错误或任何验证失败,API 会发送响应但不会 returned,因此该函数会继续运行并执行它下面的所有其他代码。
您应该知道,在 HTTP 请求中,响应只能发送一次,当函数在出错后再次发送响应时,它会向您显示在将响应发送到客户端后无法发送响应 headers .
希望这对您有所帮助。祝你好运:)
当发送多次会产生错误时,您只能向客户端发送一次响应
[ERR_HTTP_HEADERS_SENT] Cannot set headers after they are sent to the
client
我遇到了同样的错误。就我而言,我发送了两次回复。
1)保存用户前
res.send(user);//<----after removing this statement my problem was fixed.
2)保存用户后
await user.save().then(result=>{
return res.send(result);
}).catch(err=>{
return res.sendStatus(500).send({
message:err.message|| "some error occured"
});
})
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (C:\root\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\root\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\root\node_modules\express\lib\response.js:267:15)
at ServerResponse.send (C:\root\node_modules\express\lib\response.js:158:21)
at grade.save (C:\root\route\api\listsData.js:223:32)
at C:\root\node_modules\mongoose\lib\model.js:4604:16
at C:\root\node_modules\mongoose\lib\utils.js:268:11
at $__save.error (C:\root\node_modules\mongoose\lib\model.js:472:16)
at C:\root\node_modules\kareem\index.js:246:48
at next (C:\root\node_modules\kareem\index.js:167:27)
at next (C:\root\node_modules\kareem\index.js:169:9)
at Kareem.execPost (C:\root\node_modules\kareem\index.js:217:3)
at _handleWrapError (C:\root\node_modules\kareem\index.js:245:21)
at C:\root\node_modules\kareem\index.js:272:14
at _next (C:\root\node_modules\kareem\index.js:94:14)
Emitted 'error' event at:
请帮忙,我已经面临这个问题将近 3 天了,下面是我的后端 nodejs 代码: 等级模型
const mongoose = require('mongoose');
const GradeSchema = new mongoose.Schema({
name: {
type: String,
maxlength: 100,
required: true,
unique: true
}
})
module.exports = Grade = mongoose.model('Grade', GradeSchema);
添加等级路线
'/add/grade',
[
check('name', 'grade name is require')
.not()
.isEmpty()
],
auth,
admin,
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) res.status(400).send({ errors: errors.array() });
const grade = new Grade(req.body);
grade.save((err, doc) => {
if (err) res.status(400).send({ success: false, err });
return res.status(200).send({
success: true,
grade: doc,
msg: 'Grade add successfully'
});
});
}
);
问题是当我尝试使用 post 请求添加成绩时它工作正常,但如果我输入空白字段并再次发送请求,应用程序崩溃并且它 returns 'Cannot set headers after they are sent to the client' 以上的错误。谢谢。
一旦发生错误,您需要return您的错误响应,否则您的函数将保持运行并在错误发生后执行以下代码。
'/add/grade',
[
check('name', 'grade name is require')
.not()
.isEmpty()
],
auth,
admin,
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).send({ errors: errors.array() });
const grade = new Grade(req.body);
grade.save((err, doc) => {
if (err) return res.status(400).send({ success: false, err });
return res.status(200).send({
success: true,
grade: doc,
msg: 'Grade add successfully'
});
});
}
);
因为如果发生错误或任何验证失败,API 会发送响应但不会 returned,因此该函数会继续运行并执行它下面的所有其他代码。
您应该知道,在 HTTP 请求中,响应只能发送一次,当函数在出错后再次发送响应时,它会向您显示在将响应发送到客户端后无法发送响应 headers .
希望这对您有所帮助。祝你好运:)
当发送多次会产生错误时,您只能向客户端发送一次响应
[ERR_HTTP_HEADERS_SENT] Cannot set headers after they are sent to the client
我遇到了同样的错误。就我而言,我发送了两次回复。 1)保存用户前
res.send(user);//<----after removing this statement my problem was fixed.
2)保存用户后
await user.save().then(result=>{
return res.send(result);
}).catch(err=>{
return res.sendStatus(500).send({
message:err.message|| "some error occured"
});
})