提问者:小点点

为什么我不能在JavaScript中访问这个对象的元素?


在完成了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._idundefined。 奇怪的是,当我删除.id并简单地调用console.log(user)时,我得到了以下结果:

[
    {
        _id: 5ef5c1adfc196d47107679ce,
        username: 'jemorgan',
        ...
    }
]

我觉得这里一定缺少了一些简单的东西。 我的疑难解答使我相信user.find()函数在数据库中找到了正确的文档,并且FoundUser引用了正确的对象。 然而,当我试图访问该对象的元素时,我被告知它们是未定义的,尽管我可以清楚地看到该对象确实有这些元素。

为了保持简短,我不在这里展示整个项目,但是如果有人想要上下文,项目就托管在我的GitHub上。

谢谢你的建议。


共2个答案

匿名用户

看起来您正在使用。find和not.findone通过Mongoose进行查询,很容易混淆这两者,但是第一个将总是返回与查询匹配的文档数组,而第二个将返回它根据查询找到的第一个对象。 当查询电子邮件/ID等时,应该使用findone。

匿名用户

在您的示例中:

let user=[
    {
        _id: 5ef5c1adfc196d47107679ce,
        username: 'jemorgan',
        ...
    }
]

由于user是一个数组,因此您不能访问user._id,而应访问user[0]?._id