【问题标题】:Unable to read JSON property. Property Undefined无法读取 JSON 属性。属性未定义
【发布时间】:2021-03-13 21:19:14
【问题描述】:

我的 MongoDB 中有这个文档

{
    _id: 603e59811a640a0d1097bc35,
    firstName: 'ABC',
    lastName: 'XYZ',
    address: 'Mars',
    age: 20,
    mobile: 9922334455,
    email: 'abc@gmail.com',
    password: 'pass',
    type: 'citizen',
    __v: 0
}

下面是我用来获取它的代码:

router.post('/login', (req, res) => {
    const user = new User({
        userName: req.body.userName,
        password: req.body.password,
    })

    User.findOne(
        {
            email: user.userName,
            password: user.password,
        },
        (err, data) => {
            console.log(data)
        }
    )
})

在控制台中我得到的输出是:

{
  _id: 603e59811a640a0d1097bc35,
  firstName: 'ABC',
  lastName: 'XYZ',
  address: 'Mars',
  age: 20,
  mobile: 9922334455,
  email: 'abc@gmail.com',
  password: 'pass',
  type: 'citizen',
  __v: 0
}

现在,当我尝试访问console.log(data.firstName) 之类的数据时,它显示我为undefined。但是如果我做console.log(data._id) 这是第一个属性的键,它会给出正确的值,即603e59811a640a0d1097bc35

更新

我尝试调试并发现: enter image description here

result 的数据类型是model。如果我使用${result._doc.firstName},它会给我名字。但这是访问属性的正确方法吗?

【问题讨论】:

  • 您是否将密码以明文形式存储在数据库中?您应该永远不要这样做,而是存储哈希值!
  • 我正在学习node和MongoDB。稍后会这样做。你对我提出的问题有解决方案吗?
  • 你写console.log(data.firstName)的地方和console.log(data)完全一样吗?
  • @t.niese 是的,我做到了。

标签: javascript node.js json mongodb crud


【解决方案1】:

也许您应该对集合使用 .then().catch() 方法,因为它们返回一个承诺。

你的例子是:

await User.findOne({
        email: user.userName,
        password: user.password
    })
    .then(result => {
        if (result) {
            console.log(`Successfully found document: ${result}.`);
        } else {
            console.log("No document matches the provided query.");
        }
        return result;
    })
    .catch(err => console.error(`Failed to find document: ${err}`));

您可以使用.findOne() 中的第二个参数来指定要包含或排除的任何字段:.findOne(data, {_id: 1, username: 1, password: 0)

有关此方法的更多信息: https://docs.mongodb.com/realm/mongodb/actions/collection.findOne/

【讨论】:

  • MongoDB 提供了一个支持回调和承诺的混合接口。所以使用回调是一种有效的使用方式。
  • 我尝试在您的代码中使用${result.firstName}。它仍然显示undefinedresult 有数据,但由于某种原因它无法访问其属性。
  • 你怎么知道它实际上有数据?
  • @tysab,阅读问题中的更新
【解决方案2】:

好的。解决了。我在响应数据上使用了.toObject(),它将modeldocument 对象转换为平面JS 对象

User.findOne({}, (err, data) => {
        const obj = data.toObject()
        console.log(objectt.firstName) // Logs 'ABC'
    })

解决方案来源:How do you turn a Mongoose document into a plain object?

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2019-11-13
    • 2023-04-01
    • 1970-01-01
    • 2020-12-28
    • 2015-10-06
    • 2019-03-14
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多