Переопределение атрибута MongoDB _id для объекта Javascript - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующий тест в моем Express проекте:

  it('testing club', async () => {
    let club = await clubDAO.create(baseClubParams);

    console.log(club)
    const resp = await http.put(`/api/user/follow/${club._id}`);
    isOk(resp);
    resp.body.data.clubs.should.include(club);
    console.log(resp.body.data.clubs)

    // Re-fetch user info to verify that the change persisted
    const userResp = await http.get(`/api/user/${currentUser._id}`);
    userResp.body.data.clubs.should.include(clubId);
  });

По журналу консоли я знаю, что club это:

{
  admins: [],
  _id: 5e8b3bcb1dc53d1191a40611,
  name: 'Club Club',
  facebook_link: 'facebook',
  description: 'This is a club',
  category: 'Computer Science',
  __v: 0
}

, а club -

[
  {
    admins: [],
    _id: '5e8b3bcb1dc53d1191a40611',
    name: 'Club Club',
    facebook_link: 'facebook',
    description: 'This is a club',
    category: 'Computer Science',
    __v: 0
  }
]

Сбой теста в строке resp.body.data.clubs.should.include (club), поскольку _id of club является ObjectId, а _id of club [0] является строкой:

AssertionError: expected [ Array(1) ] to include { admins: [],
  _id: 
   { _bsontype: 'ObjectID',
     id: <Buffer 5e 8b 3b cb 1d c5 3d 11 91 a4 06 11>,
     toHexString: [Function],
     get_inc: [Function],
     getInc: [Function],
     generate: [Function],
     toString: [Function],
     toJSON: [Function],
     equals: [Function: equals],
     getTimestamp: [Function],
     generationTime: 1586183115 },
  name: 'Club Club',
  facebook_link: 'facebook',
  description: 'This is a club',
  category: 'Computer Science',
  __v: 0 }

Я пытаюсь решить эту проблему, выполнив следующие действия:

    let club = await clubDAO.create(baseClubParams);
    club._id = club._id.toString()

    console.log(club)

Однако это не меняет club_id. Осталось быть ObjectId. Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 06 апреля 2020

Пн goose действительно очень раздражает, потому что имеет дело с неизменными объектами. Вы не можете напрямую изменить _id таким способом.

Одним из решений является преобразование объекта Mon goose в обычный объект раньше:

club = club.toObject();
club._id = club._id.toString();

Если он не работает, попытаться глубоко клонировать ваш объект. Не элегантно, но эффективно:

club = JSON.parse(JSON.stringify(club));

Смежный вопрос: являются ли данные, возвращаемые с понедельника goose неизменными?

...