【问题标题】:Node.js / Mongodb insert callback returning undefinedNode.js / Mongodb 插入回调返回未定义
【发布时间】:2016-04-05 21:08:06
【问题描述】:

当我运行下面的简单代码插入新文档时:

collectionUsers.insert({'name':'john'},function(err,records){
    if (err) throw err;
    console.log("Id of new document added =  " + records[0]._id);
});

我收到以下错误:

catch(err) { process.nextTick(function() { throw err}); }
                                             ^
TypeError: Cannot read property '_id' of undefined

回调函数不是返回一个数组吗?我只是想获取新文档的 id 并将其保存在变量中以备将来使用。感谢您的帮助。

或者,如果我改用 insertOne,我会得到以下输出: 添加的新文档的 ID = {"ok":1,"n":1}

但我想使用插入...

【问题讨论】:

标签: node.js mongodb


【解决方案1】:

records 中有 ops 对象,其中包含插入的文档/文档。

试试:

collectionUsers.insert({'name':'john'},function(err,records){
   // You can explore more here
   console.log("record contents",JSON.stringify(records,null,4));
   // Desired output
   console.log("Id of new document added =  " + records.ops[0]._id);
});

【讨论】:

  • 当我添加你的行时,我得到这个输出:记录内容 [object Object]...为什么记录不只是给我文档?我见过很多使用相同代码的示例,它们没有返回任何错误。
  • 答案已编辑。它的npm mongodb 库实现给你这个结果。或者,您可以使用 npm mongoose,它是 mongodb npm 的包装器。它会给你想要的结果,更多信息here
  • 用你的 stringify 代码我得到了这个(就像我使用 insertOne 一样): { "ok": 1, "n": 1 }
  • @user2285490 mongoose 不仅仅是一个包装器。这是一个很棒的库,但为了获得所需的结果可能有点矫枉过正:-) 正如您所建议的,插入的文档可通过records.ops 获得。
  • 对不起各位...为什么记录不能访问姓名字段?
【解决方案2】:

非常感谢 user2285490 和 robertklep。我终于意识到记录中的 ops 对象是什么。这是供将来参考的api文档:

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#~insertWriteOpCallback

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2017-02-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多