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