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