javascript - 未处理的PromiseRejection警告: undefined in Mongoose

标签 javascript node.js mongoose promise

当尝试使用 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/

相关文章:

javascript - 如何在 Angular 7 中将 Ionic Style 属性与条件绑定(bind)?

javascript - 将工具提示添加到 Javascript 中的下拉列表

javascript - 使用 PHP 和 MySql 上传带有表单数据的 AngularJS 文件

node.js - 使用其中包含的内容对查询进行序列化

ssl - 如何在带有 SSL 的 Mongoose 嵌入式 Web 服务器上使用 http websocket?

node.js - Mongoose - 从架构内访问填充字段

javascript - 将 javascript 值传递给 PHP

Node.js:类型错误无法读取未定义的属性 'find'

javascript - 哪个 Express.js 模板按原样使用 HTML?

mongodb - 为什么我的 Mongoose 模型无法加载?