当尝试使用 Mongoose 对用户进行身份验证时,我在控制台中收到以下警告:
( Node :20114)UnhandledPromiseRejectionWarning:未定义
( Node :20114)UnhandledPromiseRejectionWarning:未处理的 promise 拒绝。此错误的根源是在没有 catch block 的情况下抛出异步函数内部,或者拒绝未使用 .catch() 处理的 Promise。 (拒绝 ID:1)
( Node :20114)[DEP0018] DeprecationWarning:未处理的 promise 拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。
尝试跟踪堆栈不会产生任何结果,我得到的只是未定义
。 Stackoverflow 上也存在类似的问题,但它们不适用于我的情况。知道这会导致什么吗?
我的路由 Controller 正在调用 Mongoose 模型内的 findByCredentials
函数:
Controller
static login(req, res) {
User.findByCredentials(req.body.email, req.body.password)
.then(user => {
return user.generateAuthToken().then(token => {
res.header("x-auth", token).json(user);
});
})
.catch(error => {
res.status(400).json({ message: "Invalid credentials." });
});
}
型号
userSchema.statics.findByCredentials = function(email, password) {
return this.findOne({ email }).then(user => {
if (!user) {
Promise.reject();
}
return new Promise((resolve, reject) => {
bcrypt.compare(password, user.password, (err, res) => {
res ? resolve(user) : reject();
});
});
});
};
最佳答案
错误未定义
来自您的Promise.reject()
,您没有向它传递任何错误消息,因此您实际上抛出了未定义。
它不会被登录中的 catch 捕获,因为您没有从 findByCredentials
方法返回它。
解决方案:
userSchema.statics.findByCredentials = function(email, password) {
return this.findOne({ email }).then(user => {
if (!user) {
return Promise.reject('User not available');
}
return new Promise((resolve, reject) => {
bcrypt.compare(password, user.password, (err, res) => {
res ? resolve(user) : reject();
});
});
});
};
关于javascript - 未处理的PromiseRejection警告: undefined in Mongoose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523975/