Node.js 节点js POST请求错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置头
我已经使用NodeJS、Express和MongoDB开发了REST服务。 我已经定义了一个POST请求,将用户添加到DB表中,当我尝试(在本地主机上)POSTMAN提供的REST服务时,他会工作并将用户添加到表中,但节点应用程序崩溃(server.js),我收到以下错误: 抛出新的ERR_HTTP_头_SENT('set'); ^ 错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 此错误与我的代码有关:Node.js 节点js POST请求错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置头,node.js,mongodb,express,Node.js,Mongodb,Express,我已经使用NodeJS、Express和MongoDB开发了REST服务。 我已经定义了一个POST请求,将用户添加到DB表中,当我尝试(在本地主机上)POSTMAN提供的REST服务时,他会工作并将用户添加到表中,但节点应用程序崩溃(server.js),我收到以下错误: 抛出新的ERR_HTTP_头_SENT('set'); ^ 错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 此错误与我的代码有关: router.post('/user', Veri
router.post('/user', VerifyToken, function (req, res) {
User.findOne({ username: req.body.username }, function (err, user) {
if (user) return res.status(400).send({status: 'ko', error: { msg: 'The username you have entered is already associated with another user.'}});
var hashedPassword = bcrypt.hashSync(req.body.password, 8);
User.create({
firstname:req.body.firstname,
surname:req.body.surname,
username:req.body.username,
email: req.body.email,
password: hashedPassword,
farmId: req.body.farmId,
roles: req.body.roles,
isVerified : req.body.isVerified,
statusUser : req.body.statusUser
},
function (err, user) {
if (err) return res.status(500).send("There was a problem adding the user to the database.");
res.status(200).send({status: 'ok', data: { msg: 'User saved', user: user}});
var client = nodemailer.createTransport(sgTransport(options));
var email = {
from: 'noreply-tlcplus@trelleborg.com',
to: req.body.email,
subject: 'Registration successfully confirmed',
text: 'Hi '+ req.body.username + ',\n\nyour account has been registered.\n\nAre you the farm owner?' +
'\n\nPlease go to this link [CMS link] to create your Profile and start to use the App Plus!\n\n'+
'If you are a simple user, please just use your credentials to login to the App Plus section into the new App!\n\n'+
'Download for free from App Store or Google Play!\n\nRegards,\n\nTrelleborg TLC Plus team'
};
client.sendMail(email, function(err, json){
if (err){
return res.status(500).send({ msg: err.message });
}
else {
res.status(200).send({status: 'ok', data: { msg: 'A verification email has been sent to ' + user.email + '.'}} )
}
});
});
});
});
行错误位于res.status(200)上,用于发送验证邮件。
为什么我的应用程序崩溃,错误在哪里?
请问有什么帮助吗?
谢谢您不能为一个请求发送多个响应。您向请求发送了两次响应。一个是在创建记录之后,另一个是在发送邮件之后。创建用户后发送,并在后台发送电子邮件,或者仅在邮件发送过程完成后发送成功响应
希望这有帮助:)发生这种情况是因为您发送了两次响应。因此,错误是:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
将代码更改为以下内容:
router.post('/user', VerifyToken, function (req, res) {
User.findOne({ username: req.body.username }, function (err, user) {
if (user) return res.status(400).send({status: 'ko', error: { msg: 'The username you have entered is already associated with another user.'}});
var hashedPassword = bcrypt.hashSync(req.body.password, 8);
User.create({
firstname:req.body.firstname,
surname:req.body.surname,
username:req.body.username,
email: req.body.email,
password: hashedPassword,
farmId: req.body.farmId,
roles: req.body.roles,
isVerified : req.body.isVerified,
statusUser : req.body.statusUser
},
function (err, user) {
if (err) return res.status(500).send("There was a problem adding the user to the database.");
var client = nodemailer.createTransport(sgTransport(options));
var email = {
from: 'noreply-tlcplus@trelleborg.com',
to: req.body.email,
subject: 'Registration successfully confirmed',
text: 'Hi '+ req.body.username + ',\n\nyour account has been registered.\n\nAre you the farm owner?' +
'\n\nPlease go to this link [CMS link] to create your Profile and start to use the App Plus!\n\n'+
'If you are a simple user, please just use your credentials to login to the App Plus section into the new App!\n\n'+
'Download for free from App Store or Google Play!\n\nRegards,\n\nTrelleborg TLC Plus team'
};
client.sendMail(email, function(err, json){
if (err){
return res.status(500).send({ msg: err.message });
}
res.status(200).send({status: 'ok', data: { msg: 'A verification email has been sent to ' + user.email + '.'}, message: 'User saved.'} )
});
});
});
});