【问题标题】:using spread syntax with Mongoose Document after calling the .save method results in undefined keys在调用 .save 方法后对 Mongoose Document 使用扩展语法会导致未定义的键
【发布时间】:2020-01-27 07:15:23
【问题描述】:

我使用的是 Mongoose/MongoDB,当我在调用 .save() 后尝试使用扩展语法从文档中返回值时,我遇到了一些奇怪的行为。

// Npc is a Mongoose schema
const npc = new Npc({
        ...input,
        creator: userId
      });

const createdNpc = await npc.save();

我尝试过使用 spad 运算符,但名称和描述键不存在。

return {
          ...createdNpc
          creator: userFromId(npc.creator)
}

但是,当我直接访问这些值时,它们已被定义

return {
          description: createdNpc.description,
          name: createdNpc.name,
          creator: userFromId(npc.creator)
        };

我已确保描述和名称的拼写正确。我已经尝试记录{...createdNpc} 和{...createdNpc, description: createdNpc.description, name: createdNpc.name}。在日志中,我确认名称和描述都没有在 {...createdNpc}

中定义(键不存在)

我还尝试记录 createdNpc 和 {...createdNpc} 并确认它们返回不同的值。

这里创建了Npc:

{
  _id: 5d8d5c7a04fc40483be74b3b,
  name: 'NPC Name',
  description: 'My Postman NPC',
  creator: 5d8d50e0b5c8a6317541d067,
  __v: 0
}

它实际上根本不像猫鼬文档。我会发布{...createdNPC} 的结果以显示差异,但这是一个巨大的代码 sn-p,我不想让问题变得混乱。如果有帮助,我很乐意提供!

我对 MongoDB 和 Mongoose 还是很陌生。为什么在 Mongoose Document 上使用扩展语法会改变它的值?

我认为这应该与问题无关,但以防万一我还会提到这是针对 graphql 解析器的。

【问题讨论】:

  • 我敢打赌属性是在内部原型上,而不是在对象本身上,在这种情况下,传播不会复制它们 - 请通过 console.dir 检查确定

标签: node.js mongodb express mongoose graphql


【解决方案1】:

这是因为 Mongoose 对其所有属性都使用了 getter。在使用扩展运算符之前,请调用createdNpc.toObject() 以获取普通对象。

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2017-04-24
    • 2015-06-10
    • 2015-01-04
    • 2017-08-02
    • 2020-04-07
    • 2023-03-07
    • 2014-10-12
    相关资源
    最近更新 更多