为啥我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效?
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 博客文章(仅)上收到错误消息
为啥我在使用 Spring Boot Application 的邮递员中没有收到错误消息