为什么即使错误处理似乎可以正常工作,在模式静态方法上定义的错误消息也没有显示?

时间:2019-04-30 22:05:18

标签: javascript express mongoose error-handling mongoose-schema

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


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


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

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

,然后按如下所示修改我的Express路线中的.catch()

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

在当前状态下,Express路由具有控制台日志,如果存在错误,该日志将触发-控制台日志IS显示在我的控制台中。但是在邮递员中,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
}

期望的结果只是让我访问在静态方法中定义的错误消息。对于应用程序的运行方式而言,它不是必不可少的-这绝对是出于我自己的观点。再次,据我所知,一切都按照中间件的实际工作来进行-当提供的电子邮件地址和密码与数据库中存储的电子邮件地址匹配时,即从数据库返回用户文档。我只是没有错误消息,目前,我希望能够查看给定的电子邮件地址或密码是否不正确(尽管我知道这可能在实际应用程序中带来安全隐患)。

2 个答案:

答案 0 :(得分:0)

因此,我在这里找到了一种可能的解决方法: 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
}

答案 1 :(得分:0)

只需从

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

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