繁体   English   中英

为什么我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效?

[英]Why are my error messages defined on a schema static method not showing up even though the error handling is apparently working?

我在模式上定义了一个静态方法,该方法定义了 mongodb 数据库中用户文档的结构。 .findByCredentials()方法检查用户提供的电子邮件和密码是否与数据库中的现有用户和(散列)密码匹配。 如果无法通过该方法找到user ,则会引发错误。 如果找到用户但bcrypt.compare()返回false (即,提供的密码与存储在数据库中的密码不匹配bcrypt.compare()执行相同的操作。 我正在使用猫鼬和快递。


我遇到的问题是我定义的错误消息没有传递到我的 Express 路由 - 但是当我将错误的凭据传递给路由时,我用于处理错误的.catch()语句会触发(因此中间件功能)。 我可以更新res.status()并且我可以从.catch()语句中获取控制台日志,但是我无法显示我在中间件中定义的错误。 请原谅我的...不准确的描述 - 我对后端和服务器比较陌生,所以我仍在弄清楚如何描述我遇到的问题。


我尝试通过执行以下操作来定义 Error 上的message属性:

throw new Error({ message: "Some message goes here" })

然后在我的 Express 路由中修改.catch()如下:

.catch (error) {
  res.status(400)
  res.send(error.message)
}

在当前状态下,Express 路由有一个控制台日志,如果存在错误,则会触发该日志 - 并且控制台日志显示在我的控制台中。 但是在 Postman 中, res.send(error)只显示一个空对象。 我的 Express 应用程序配置为解析 JSON ( app.use(express.json()) ),所以我也尝试解析错误,但我也没有运气。

快速路线:

router.post('/users/login', async (req, res) => {
  const _email = req.body.email
  const _password = req.body.password

  try {
    const user = await User.findByCredentials(_email, _password)
    res.send(user)
  } catch (error) {
    res.status(400)
    if (error) {
      console.log("THERES An ERROR")  // THIS CONSOLE LOG IS FIRING
      res.send(error)
    }
  }
})

中间件(在相当典型的用户架构上定义)

serSchema.statics.findByCredentials = async function (email, password) {
  const user = await User.findOne({ email })

  if (!user) {
    throw new Error({ message: 'Unable to log in. Please check credentials and try again.' })
  }

  const isMatch = await bcrypt.compare(password, user.password)

  if (!isMatch) {
    throw new Error({ message: 'Unable to log in. Please check credentials and try again.' })
  }

  return user
}

所需的结果只是让我访问我在静态方法中定义的错误消息。 对于应用程序的运行方式来说,这并不重要——这绝对是为了我自己的启迪。 同样,据我所知,一切都在中间件实际应该做什么方面工作 - 当提供的电子邮件地址和密码与数据库中存储的内容匹配时,从数据库返回用户文档。 我只是没有错误消息,目前,我希望能够查看给定的电子邮件地址或密码是否不正确(尽管我知道这可能会在实际应用程序中带来安全问题)。

只是删除await

const isMatch = await bcrypt.compare(password, user.password)

一切都会好起来的。 我遇到了那个错误,我已经搜索了 2 3 天,但最终删除 await 确实有效。

所以我找到了一个可能的解决方法: https//humanwhocodes.com/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

(来自博文:)

function MyError(message){
    this.message = message;
}

MyError.prototype = new Error();

在我的具体情况下,如上面的问题所示:

userSchema.statics.findByCredentials = async function (email, password) {
  const user = await User.findOne({ email })
  function myError(message) {
    this.message = message
  }

  myError.prototype = new Error()

  if (!user) {
    console.log('Provide a user, you doofus')
    throw new myError('Unable to log in. Please check credentials and try again.')
  }

  const isMatch = await bcrypt.compare(password, user.password)

  if (!isMatch) {
    console.log('Password does not match, learn how to type')
    throw new Error('Unable to log in. Please check credentials and try again.')
  }

  return user
}

检查您的模型密码字段,也许您有一个小写:true 属性,而且如果您在路由捕获中使用throw new Error('error message') ,您需要像 JSON 一样发送它。 前任。

res.json({error: e.message})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM