在完成了Udemy的web开发课程后,我正在做一个简单的业余爱好项目,我在编写一个简单的中间件时遇到了一些问题。
所讨论的功能如下:
const User = require('../models/user.js');
const middleware = {
checkIfAdmin: function checkIfAdmin(req, res, next) {
if (req.isAuthenticated()) {
User.find({"username": "jemorgan"}, (err, foundUser) => {
console.log(foundUser._id);
if (err) {
req.flash("error", "Something went wrong");
} else if (foundUser._id === req.user._id) {
console.log("Going next");
next();
} else {
console.log("going back");
req.flash("error", "You don't have permission to do that.");
res.redirect("back");
}
});
}
}
}
module.exports = middleware;
当我在没有console.log
的情况下运行代码时,不管我是否以正确的用户身份登录,都要计算最后的else分支。 我输入console.log
尝试排除故障,发现user._id
是undefined
。 奇怪的是,当我删除.id
并简单地调用console.log(user)
时,我得到了以下结果:
[
{
_id: 5ef5c1adfc196d47107679ce,
username: 'jemorgan',
...
}
]
我觉得这里一定缺少了一些简单的东西。 我的疑难解答使我相信user.find()
函数在数据库中找到了正确的文档,并且FoundUser
引用了正确的对象。 然而,当我试图访问该对象的元素时,我被告知它们是未定义的,尽管我可以清楚地看到该对象确实有这些元素。
为了保持简短,我不在这里展示整个项目,但是如果有人想要上下文,项目就托管在我的GitHub上。
谢谢你的建议。
看起来您正在使用。find和not.findone通过Mongoose进行查询,很容易混淆这两者,但是第一个将总是返回与查询匹配的文档数组,而第二个将返回它根据查询找到的第一个对象。 当查询电子邮件/ID等时,应该使用findone。
在您的示例中:
let user=[
{
_id: 5ef5c1adfc196d47107679ce,
username: 'jemorgan',
...
}
]
由于user是一个数组,因此您不能访问user._id
,而应访问user[0]?._id