Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在模式静态方法上定义的错误消息没有显示出来,即使错误处理显然在工作?_Javascript_Express_Mongoose_Error Handling_Mongoose Schema - Fatal编程技术网

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

Javascript 为什么在模式静态方法上定义的错误消息没有显示出来,即使错误处理显然在工作?,javascript,express,mongoose,error-handling,mongoose-schema,Javascript,Express,Mongoose,Error Handling,Mongoose Schema,我在模式上定义了一个静态方法,该方法定义了mongodb数据库中用户文档的结构。方法.findByCredentials()检查用户提供的电子邮件和密码是否与数据库中的现有用户和(哈希)密码匹配。如果该方法找不到用户,则会抛出错误。如果找到用户,但bcrypt.compare()返回false(即,提供的密码与数据库中存储的密码不匹配),也会执行相同的操作。我用的是猫鼬和快车 我遇到的问题是,我定义的错误消息没有被传递到我的快速路由,但是当我将错误凭据传递到路由(以及中间件函数)时,我用于处理

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


我遇到的问题是,我定义的错误消息没有被传递到我的快速路由,但是当我将错误凭据传递到路由(以及中间件函数)时,我用于处理错误的
.catch()
语句将被触发。我可以更新
res.status()
,也可以从
.catch()
语句中获取控制台日志,但我无法显示在中间件中定义的错误。请原谅我的。。。不精确的描述-我对后端和服务器比较陌生,所以我仍然在想如何描述我遇到的问题


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

throw new Error({ message: "Some message goes here" })
然后在我的快速路线中修改
.catch()
,如下所示:

.catch (error) {
  res.status(400)
  res.send(error.message)
}
在其当前状态下,Express route有一个控制台日志,如果存在错误,将触发该日志,并且控制台日志将显示在我的控制台中。但是在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)
    }
  }
})
中间件(在相当定型的用户模式上定义)


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

因此,我发现一个可能的解决方法是:

(来自博客帖子:)

函数MyError(消息){
this.message=消息;
}
MyError.prototype=新错误();
在我的具体案例中,如上述问题所示:

userSchema.statics.findByCredentials=异步函数(电子邮件、密码){
const user=await user.findOne({email})
函数myError(消息){
this.message=消息
}
myError.prototype=新错误()
如果(!用户){
log('提供一个用户,你这个笨蛋')
抛出新myError('无法登录。请检查凭据并重试')
}
const isMatch=wait bcrypt.compare(密码,user.password)
如果(!isMatch){
console.log('密码不匹配,了解如何键入')
抛出新错误('无法登录。请检查凭据并重试')
}
返回用户
}

因此,我找到的一个可能的解决方法是:

(来自博客帖子:)

函数MyError(消息){
this.message=消息;
}
MyError.prototype=新错误();
在我的具体案例中,如上述问题所示:

userSchema.statics.findByCredentials=异步函数(电子邮件、密码){
const user=await user.findOne({email})
函数myError(消息){
this.message=消息
}
myError.prototype=新错误()
如果(!用户){
log('提供一个用户,你这个笨蛋')
抛出新myError('无法登录。请检查凭据并重试')
}
const isMatch=wait bcrypt.compare(密码,user.password)
如果(!isMatch){
console.log('密码不匹配,了解如何键入')
抛出新错误('无法登录。请检查凭据并重试')
}
返回用户
}

非常感谢!!!谢谢!!!
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
}