Node.js Mongoose idGetter错误:无法设置属性'_id';空的

Node.js Mongoose idGetter错误:无法设置属性'_id';空的,node.js,mongoose,Node.js,Mongoose,我从Mongoose idGetter函数中得到以下错误。有人能解释一下是什么导致了这一现象吗 return this.$__._id = null == this._id ^ TypeError: Cannot set property '_id' of null at model.idGetter (e:\Users\Christine\test\mvt\node_modules\mongoose\lib\schema.js:98:23) 错

我从Mongoose idGetter函数中得到以下错误。有人能解释一下是什么导致了这一现象吗

  return this.$__._id = null == this._id
                  ^
TypeError: Cannot set property '_id' of null
    at model.idGetter (e:\Users\Christine\test\mvt\node_modules\mongoose\lib\schema.js:98:23)
错误情况涉及多个客户端请求在通过internet访问的数据库上执行文档删除(在同一集合中的不同文档上)(即响应时间慢)。访问其中一个已删除文档的id时发生故障。它似乎出现在一个小的时间窗口中——我试图调试它的一切都会导致问题“消失”

申请代码概要:

Details.findOneAndRemove({ _id : remove_id}, afterRemove);

function afterRemove(err, removedDoc){
  if (!err && removedDoc){
    OtherDetails.find({ _id: some_id}, afterFind);
  }

  function afterFind(err, foundDoc){
    if (!err && foundDoc){
      // next line causes exception
      if (foundDoc.details_id === removedDoc.id) { // do stuff };
    }
  }
}

您是否在已删除的文档上定义了
id
属性

如果没有,您可能需要将
foundDoc.details\u id
removedDoc.\u id

以下是mongoose代码库中的
idGetter
函数的源代码:

function idGetter () {
  if (this.$__._id) {
    return this.$__._id;
  }

  return this.$__._id = null == this._id
    ? null
    : String(this._id);
}
据我所知,我认为
idGetter
是专门针对
ObjectId
类型的,因此存在例外


如果文档尚不存在,您还可以尝试在文档上添加一个
id
属性,以查看它是否继续引发相同的异常。

fwiw:问题可能与在64位Windows(8.1)上使用32位节点有关。安装64位节点后,我无法重现该问题


令人不满意的确定程度,但我想我会与大家分享,以防其他人遇到类似的问题,或者可以阐明这是否真的是原因。

细节有隐含的_idobjectid。OtherDetails.details\u id是一个字符串字段,因此我认为比较是正确的。代码在大多数情况下运行良好,只是在存在多个并行请求的情况下……如果Details对象只有隐式的_id,为什么要使用removedDoc.id?另外,关于并行请求,是否有可能两次删除同一文档?测试客户机尝试两次删除同一文档似乎是合理的-我将对此进行调查。我们使用removedDoc.id只是为了方便获取用于比较的id的字符串表示形式。它应该相当于执行removedDoc.\u id.toString(),这是我们与foundDoc.details\u id进行比较所需要的。这不是因为要删除同一个文档两次。在引用刚创建的文档中的id时遇到相同的错误(类似的并行请求正在进行)。事实上,猫鼬的驱动程序出现了错误。。。这意味着this.$\uuuuu文档内部缓存为空。。。这对我来说毫无意义。谢谢分享!如果节点在其他一些操作系统上的行为相同,这也会很有趣。然而,它是一种与你相伴,萦绕在你脑海深处的虫子。。。