从JavaScript对象重新定义MongoDB _id属性

问题描述 投票:0回答:1

我在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);
  });

通过控制台日志,我知道俱乐部是:

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

俱乐部是

[
  {
    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)行中失败,因为club的_id是对象ID,clubs [0]的id是字符串:

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。有人知道为什么会这样吗?

javascript mongodb chai
1个回答
0
投票

猫鼬确实非常令人讨厌,因为它处理不可变的对象。您不能通过这种方式直接修改_id。

一种解决方案是将Mongoose对象转换为之前的常规对象:

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

如果不起作用,请尝试深克隆您的对象。不优雅,但有效:

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

相关问题:is data returned from Mongoose immutable?

© www.soinside.com 2019 - 2024. All rights reserved.