![](/img/trans.png)
[英]Why 'map' function is showing undefined error even though it is defined?
[英]Why are my error messages defined on a schema static method not showing up even though the error handling is apparently working?
我在模式上定义了一个静态方法,该方法定义了 mongodb 数据库中用户文档的结构。 .findByCredentials()
方法检查用户提供的电子邮件和密码是否与数据库中的现有用户和(散列)密码匹配。 如果无法通过该方法找到user
,则会引发错误。 如果找到用户但bcrypt.compare()
返回false
(即,提供的密码与存储在数据库中的密码不匹配bcrypt.compare()
执行相同的操作。 我正在使用猫鼬和快递。
我遇到的问题是我定义的错误消息没有传递到我的 Express 路由 - 但是当我将错误的凭据传递给路由时,我用于处理错误的.catch()
语句会触发(因此中间件功能)。 我可以更新res.status()
并且我可以从.catch()
语句中获取控制台日志,但是我无法显示我在中间件中定义的错误。 请原谅我的...不准确的描述 - 我对后端和服务器比较陌生,所以我仍在弄清楚如何描述我遇到的问题。
我尝试通过执行以下操作来定义 Error 上的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
}
所需的结果只是让我访问我在静态方法中定义的错误消息。 对于应用程序的运行方式来说,这并不重要——这绝对是为了我自己的启迪。 同样,据我所知,一切都在中间件实际应该做什么方面工作 - 当提供的电子邮件地址和密码与数据库中存储的内容匹配时,从数据库返回用户文档。 我只是没有错误消息,目前,我希望能够查看给定的电子邮件地址或密码是否不正确(尽管我知道这可能会在实际应用程序中带来安全问题)。
只是删除await
从
const isMatch = await bcrypt.compare(password, user.password)
一切都会好起来的。 我遇到了那个错误,我已经搜索了 2 3 天,但最终删除 await 确实有效。
所以我找到了一个可能的解决方法: 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
}
检查您的模型密码字段,也许您有一个小写:true 属性,而且如果您在路由捕获中使用throw new Error('error message')
,您需要像 JSON 一样发送它。 前任。
res.json({error: e.message})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.