【问题标题】:TypeError: Cannot read property '0' of undefined in post method in nodejsTypeError:无法读取nodejs中post方法中未定义的属性'0'
【发布时间】:2021-07-15 08:54:26
【问题描述】:

我是 nodejs 和 mongodb 的新手。 我正在尝试使用 nodejs 和 mongodb 创建简单的待办事项应用程序。 我已经在数据库中添加了任务。 现在在 post 方法中,我使用的是 mongodb 的 insertOne 方法,在 res.json 中出现以下错误。

res.json(info.ops[0].data)
TypeError:无法读取未定义的属性“0”

代码:

app.post('/create-item', function(req, res){
    db.collection('items').insertOne({ text:req.body.text }, function(err, info){
      res.json(info.ops[0])
    })
}) 

下面是错误的截图。

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    在当前版本中,insertOne 成功时没有返回名为 ops 的属性。

    因此出现错误TypeError: Cannot read property '0' of undefined

    insertOne 返回两个属性:

    acknowledged
    指示此写入结果是否已被确认。如果不是,则此结果的所有其他成员都将是未定义的
    insertedId
    插入的标识符。如果服务器生成标识符,则该值将为空,因为驱动程序无权访问该数据

    见:

    app.post('/create-item', function(req, res){
        db.collection('items').insertOne({ text:req.body.text }, function(err, info){
          console.log(info.acknowledged)
           console.log(info.acknowledged)
          res.json(info.acknowledged)
        })
    }) 
    
    

    在以前的版本中,例如 3.2,为 insertOne 返回了不同的属性:

    同样,updateOne 返回了不同的属性:

    有关从早期版本迁移到版本 4 的更多信息,请参阅文章:

    Changes in 4.x (and how to migrate!)

    【讨论】:

    • 如果它对任何人有帮助,我最近更新了一个旧项目,该项目曾经将 "mongodb": "^3.2.7" 作为 package.json 的依赖项。我的代码确实引用了topic_id = topic.ops[0]._id.toString()。 mongodb 节点文档当前版本为4.1。在mongodb节点文章Changes in 4.x (and how to migrate!)中,CRUD results部分特别提到了insertOne()的结果属性的变化。
    【解决方案2】:

    我今天在待办事项应用教程中遇到了同样的问题。对于那些感兴趣的人,请尝试更改行 - res.json(info.ops[0])

    to - res.json({ _id: info.insertedId.toString(), text: req.body.text })

    这会从数据库中为新添加的项目获取插入的 id。由于“信息”似乎没有返回当前版本的 mongodb 中插入的文本 - 我从请求参数中添加了它。

    我从这里获得了我的信息 - Get the _id of inserted document in Mongo database in NodeJS

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    你做错了首先检查错误然后发送res.json,因为错误是因为如果数据没有成功插入,你的信息可能为空,所以你需要这样做

    app.post('/create-item', function(req, res){
        db.collection('items').insertOne({ text:req.body.text }, function(err, info){
          if (err) {
               res.json({message: "not inserted successFully"});
               return;
           }
          res.json(info.ops[0])
        })
    })
    

    现在在上面的代码中,如果数据没有成功插入会发生什么,它将发送错误作为响应并从函数返回。

    【讨论】:

    • 仍然,错误仍然存​​在:(我已上传截图供参考。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2022-09-23
    • 2022-11-29
    相关资源
    最近更新 更多