【问题标题】:UnhandledPromiseRejectionWarning: TypeError: Cannot read propertyUnhandledPromiseRejectionWarning:TypeError:无法读取属性
【发布时间】:2021-09-03 17:28:37
【问题描述】:

我正在尝试创建一个简单的登录验证,但是当我通过邮递员故意在登录发布方法中输入错误的电子邮件时,我收到了这个错误。

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'password' of null at C:\Users\layug\Documents\work\zuitt\batch-125\s32 -36\course-booking-api\controllers\userControllers.js:54 :74 在 processTicksAndRejections (internal/process/task_queues.js:95:5)

当邮箱正确,密码错误时,我会收到错误的邮箱或密码信息错误信息。

问题是电子邮件不正确,或者在数据库中找不到电子邮件(通过“结果”变量)。在这些情况下,它开始在控制台中显示错误。

我使用的代码如下。

module.exports.login = (reqBody) => {
  // model method
  return User.findOne({email: reqBody.email}).then((result, error) => {
    // This is the line causing the error.
    const isPasswordCorrect = bcrypt.compareSync(reqBody.password, result.password);
    if (result == null || isPasswordCorrect == false) {
      return "Email or password is incorrect";
    } else {
      return {access: auth.createAccessToken(result.toObject())};
    }
  });
}

当我这样写条件时,一切正常,但这不是我登录验证的理想条件。

module.exports.login = (reqBody) => {
  return User.findOne({ email: reqBody.email }).then((result, error) => {
    if (result == null) {
      return "Email not registered";
    } else {
      const isPasswordCorrect = bcrypt.compareSync(reqBody.password, result.password);
      if (isPasswordCorrect === true) {
        return { access: auth.createAccessToken(result.toObject()) };
      } else {
        return "Wrong password";
      }
    }
  });
}

【问题讨论】:

  • 你向login函数传递了什么?
  • 这可能是因为访问了reqBody.password,其中请求正文中的password 属性为空。试试你是否可以在你的代码中使用可选链(ES2020),这将是reqBody?.password。如果不是,请检查密码属性是否明确为空。
  • @PyxlDavon 只是一个 request.body 数据,包含电子邮件和密码
  • 你能发布 HTML 表单吗,因为正文来自那里
  • @HadidAli,我不确定可选链环,从未听说过。我确定密码不为空,因为如果电子邮件和密码都正确,我可以登录,或者如果只有密码不正确,则显示不正确的电子邮件或密码

标签: javascript node.js express


【解决方案1】:

简单的解决方法是将尝试获取用户密码的函数包装在 try-catch 语句中。在这种情况下,您正在查找一个不存在的用户,该用户返回一个 null,然后您尝试读取该用户的密码,给您错误“无法读取 null 的密码”

//model method
return User.findOne({ email: reqBody.email }).then((result, error) => {
  //below is the line where I get the error
  try {
    const isPasswordCorrect = bcrypt.compareSync(
      reqBody.password,
      result.password
    );

    if (result == null || isPasswordCorrect == false) {
      return "Email or password is incorrect";
    } else {
      return { access: auth.createAccessToken(result.toObject()) };
    }
  } catch (err) {
    return "Email does not exist";
  }
});

顺便说一句,您的解决方案很好。

【讨论】:

  • 简单地说,您在数据库中查找电子邮件。该电子邮件在数据库中不存在,因此它返回“null”。之后,您尝试从“null”值中读取“password”,这会提示节点抛出错误。 try catch 尝试在返回的 'null' 值上查找密码值,但是当抛出错误时,不是让您的应用程序崩溃,而是被 catch 语句捕获,然后您返回“找不到电子邮件”。跨度>
  • 你好。感谢您的输出。但是,“电子邮件不存在”是我要排除的。只需在其中一个错误时显示“不正确的电子邮件或密码”即可。我尝试了您的解决方案,因为我仍然是尝试 catch 的新手,并且想看看它是如何工作的。
  • @oh kr4bz,糟糕的是我没有意识到这一点。掌心。对不起,谢谢你们
猜你喜欢
  • 2021-03-27
  • 2021-09-16
  • 1970-01-01
  • 2021-05-20
  • 2021-04-18
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多