在我的Node.js后台,我有一个端点,在那里更新用户配置文件信息。如果新邮件已经在数据库中,我想给用户发送一个错误的响应。然而,虽然我已经设置了一个 try-catch
的地方,但我还是无法捕捉到这个错误。相反,服务器只是以下面的mongoose错误信息崩溃。我在前端收到了一个错误响应,但是距离错误发生的时间已经过了很久。所有有用的建议都非常感激。
(node:11864) UnhandledPromiseRejectionWarning: MongoError.E11000重复键错误收集。E11000重复密钥错误集合:widubima.usersindex: email_1 dup key: { : "[email protected]" } ... (node:11864) UnhandledPromiseRejectionWarning。未处理的承诺拒绝。这个错误源于在没有 catch 块的异步函数内部抛出,或者拒绝一个没有用 .catch() 处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用 CLI 标志。
--unhandled-rejections=strict
(见 https:/nodejs.orgapicli.html#cli_unhandled_rejections_mode。). (拒绝ID:1)
UpdateProfile
在UserController.js中
updateProfile: (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
try{
User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{new: true, useFindAndModify: false}).then(function(updatedUser, err){
if(err) {
console.log(err);
next(err,null)
} else {
next(null,updatedUser)
}
);
}
catch(err){
console.log(err);
next(err,null)
}
}
try...catch可以和asyncawait一起使用,而不能和promise...then一起使用,promise...then有一个特殊的块,叫做catch,可以作为。
updateProfile: (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{
new: true, useFindAndModify: false
}).then(updatedUser => {
next(null,updatedUser)
).catch(err =>{
console.log(err);
next(err,null)
})
}
如果你想使用asyncawait,那么。
updateProfile: async (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
try{
const updatedUser = await User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{
new: true, useFindAndModify: false
})
next(null,updatedUser)
} catch(err) {
console.log(err);
next(err,null)
})
}