использование синтаксиса распространения с Mongoose Document после вызова метода .save приводит к неопределенным ключам - PullRequest
0 голосов
/ 27 сентября 2019

Я использую Mongoose / MongoDB и получаю странное поведение, когда пытаюсь использовать синтаксис распространения для возврата значений из документа после того, как я вызову .save () для него.

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

const createdNpc = await npc.save();

Я пытался использовать оператор spead, но ключи имени и описания не существуют.

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

однако, когда я получаю прямой доступ к этим значениям, они определены

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

I 'Мы убедились в правильности написания описания и имени.Я пробовал войти в систему как {...createdNpc}, так и {...createdNpc, description: createdNpc.description, name: createdNpc.name}.В журналах я подтвердил, что как имя, так и описание не определены (ключи не существуют) внутри {... creationNpc}

Я также попытался войти в систему createdNpc и {...createdNpc} иподтвердили, что они возвращают разные значения.

вот созданный NPC:

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

на самом деле он вообще не выглядит как документ Mongoose.Я бы опубликовал результат {...createdNPC}, чтобы показать разницу, но это огромный фрагмент кода, и я не хочу загромождать вопрос.Я рад предоставить это, если это поможет!

Я все еще очень плохо знаком с MongoDB и Mongoose.Почему использование синтаксиса распространения в документе Mongoose изменяет его значение?

Я не думаю, что это должно относиться к вопросу, но на всякий случай я также упомяну это для распознавателя graphql.

1 Ответ

1 голос
/ 27 сентября 2019

Это потому, что Mongoose использует геттеры для всех своих атрибутов.Прежде чем использовать оператор распространения, вызовите createdNpc.toObject(), чтобы получить обычный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...