【问题标题】:Mongoose idGetter error: Cannot set property '_id' of nullMongoose idGetter 错误:无法设置属性“_id”为空
【发布时间】:2015-04-24 05:14:20
【问题描述】:

我从 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 };
    }
  }
}

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您分享这个!如果节点在其他一些操作系统上表现相同,那也会很有趣。然而,它是那些困扰你的错误之一,在你的脑海中挥之不去......
    【解决方案2】:

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

    如果不是,您可能需要比较 foundDoc.details_idremovedDoc._id

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

    function idGetter () {
      if (this.$__._id) {
        return this.$__._id;
      }
    
      return this.$__._id = null == this._id
        ? null
        : String(this._id);
    }
    

    据我了解,我认为 idGetter 专门针对 ObjectId 类型,因此是例外。

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

    【讨论】:

    • 详细信息有隐含的_id ObjectId。 OtherDetails.details_id 是字符串字段,所以我觉得比较对。该代码大部分时间都可以正常工作,只是在有多个并行请求的情况下......
    • 如果Details对象只有隐含的_id,为什么要使用removedDoc.id?另外,关于并行请求,您是否有可能两次删除同一个文档?
    • 测试客户端试图两次删除同一个文档是合理的——我会调查的。我们使用removedDoc.id 只是为了方便获取ID 的字符串表示以进行比较。应该等价于做removedDoc._id.toString(),这就是我们需要和foundDoc.details_id比较的地方。
    • 这不是因为两次删除同一个文档。在刚刚创建的文档中引用 id 时出现相同的错误(正在进行类似的并行请求)。事实上,猫鼬驱动程序中发生了错误......并暗示 this.$__ 文档内部缓存为空......这对我来说毫无意义。
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2020-08-25
    相关资源
    最近更新 更多