Javascript NodeJS未处理PromisejectionWarning,承诺已关闭

Javascript NodeJS未处理PromisejectionWarning,承诺已关闭,javascript,node.js,mongoose,mern,Javascript,Node.js,Mongoose,Mern,我在实现一个注册系统时遇到了一个问题,该系统使用令牌来防止随机用户创建多个帐户 代码一直运行到最后,响应按预期工作,但之后我收到一条警告,即: UnhandledPromisejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置头 它说问题发生在第44行,这是MongooseSave方法的catch语句 newRegistrationToken.save() .then(newRegistrationToken=>res.status(200)

我在实现一个注册系统时遇到了一个问题,该系统使用令牌来防止随机用户创建多个帐户

代码一直运行到最后,响应按预期工作,但之后我收到一条警告,即: UnhandledPromisejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置头

它说问题发生在第44行,这是MongooseSave方法的catch语句

newRegistrationToken.save()
.then(newRegistrationToken=>res.status(200).json(newRegistrationToken))
.catch(err=>res.status(500).json(err));
我一直在寻找解决方案,答案总是catch语句丢失,导致出现此警告。然而,在我的代码中,我没有看到任何缺少的catch语句,所以我在这里有点迷茫

以下是整个路线:

router.post('/create',(req,res)=>{
const{errors,isValid}=validateRegistrationToken(请求主体);
如果(!isValid)返回res.status(400).json(错误);
//正在搜索与给定电子邮件地址关联的活动令牌
console.log(“搜索活动令牌”);
ModelRegistrationToken.findOne({
电子邮件:req.body.email,
过期日期:{$gte:Date.now()}
})。然后(用户=>{
//如果用户发现
如果(用户){
//检查用户是否已注册
console.log(“搜索注册用户”);
ModelUser.findOne({email:user.email})。然后((注册)=>{
如果(注册)
返回res.status(400).json({email:'有一个用户已经使用给定的电子邮件地址注册'});
返回res.status(400).json({email:'给定的地址已经有一个活动的注册令牌'});
}).catch(err=>console.log(err));
}
//否则,创建一个新令牌
const newRegistrationToken=新模型注册Token({
电子邮件:req.body.email,
expiresAt:新日期(Date.now()+Number.parseInt(config.REG\u TOKEN\u expirement\u PERIOD)*24*60*60*1000)
});
console.log(“保存令牌”);
newRegistrationToken.save()
.then(newRegistrationToken=>res.status(200).json(newRegistrationToken))
.catch(err=>res.status(500).json(err));
}).catch(err=>res.status(500).json(err));
});
我似乎无法理解这一点,因此我非常感谢您在这方面的帮助。

您有:

if (user) {
  // do stuff and call res.json
}
// do other stuff and call res.json
如果
user
存在,
res.json
将被调用两次。尝试在
if(user)
块的底部返回:

if (user) {
  // check if the user is already registered
  console.log("search for registered user");
  ModelUser.findOne({
    // ...
  }).catch(err => console.log(err));
  return; // <---------------------------------
}

// Otherwise create a new token
const newRegistrationToken = new ModelRegistrationToken({
  email: req.body.email,
  expiresAt: new Date(Date.now() + Number.parseInt(config.REG_TOKEN_EXPIRATION_PERIOD) * 24 * 60 * 60 * 1000)
});
// ...
变成

}).catch(err => res.status(500).json(err));

就像你在其他地方所做的一样。

你说得太对了,出于某种原因,我假设它会停在那里,但没有什么东西可以阻止它,所以很明显它不会。谢谢你的快速回复。
}).catch(err => res.status(500).json(err));