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

Posted

技术标签:

【中文标题】为啥我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效?【英文标题】:Why are my error messages defined on a schema static method not showing up even though the error handling is apparently working?为什么我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效? 【发布时间】:2019-09-19 14:31:16 【问题描述】:

我在模式上定义了一个静态方法,该方法定义了我的 mongodb 数据库中用户文档的结构。 .findByCredentials() 方法检查用户提供的电子邮件和密码是否与数据库中的现有用户和(散列)密码匹配。如果该方法找不到user,则会引发错误。如果找到用户但bcrypt.compare() 返回false(即提供的密码与数据库中存储的密码不匹配),则执行相同的操作。我正在使用 Mongoose 和 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 路由有一个控制台日志,如果存在错误就会触发 - 并且控制台日志显示在我的控制台中。但在 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

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

【问题讨论】:

【参考方案1】:

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

res.json(error: e.message)

【讨论】:

【参考方案2】:

只需从

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

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

【讨论】:

这很有帮助,但为什么它不能与 await 一起使用 这还是我要弄清楚的!【参考方案3】:

所以我发现的一种可能的解决方法是: 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

【讨论】:

以上是关于为啥我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 mongo db 上出现重复键错误。模型,即使我没有独特的属性

为啥我在本地环境(而在原始服务器上没有)上的 Wordpress 博客文章(仅)上收到错误消息

即使在生产模式下构建,VueJS也会显示“开发模式”消息

为啥我在使用 Spring Boot Application 的邮递员中没有收到错误消息

为啥 PHP 5.2.14 不会显示任何错误(即使是从命令行)?

为啥我在使用 isNull 时收到此错误消息