Node.js Nodejs spread运算符在返回的对象中返回一些意外的键

Node.js Nodejs spread运算符在返回的对象中返回一些意外的键,node.js,express,Node.js,Express,我有res是原始对象 { time: 2020-07-26T10:39:38.135Z, isTransfered: true, _id: 5f1d5d6b60755e75b48770a6, receiverAccountNumber: '12345678', transfererAccountNumber: '11111111', receiverName: 'Lê Công Tuyền', transfererName: 'Nguyễn Thanh Tuấn',

我有
res
是原始对象

{
  time: 2020-07-26T10:39:38.135Z,
  isTransfered: true,
  _id: 5f1d5d6b60755e75b48770a6,
  receiverAccountNumber: '12345678',
  transfererAccountNumber: '11111111',
  receiverName: 'Lê Công Tuyền',
  transfererName: 'Nguyễn Thanh Tuấn',
  amount: 1000000,
  content: "test chuyefo'seajfg",
  payFeeBy: 'transferer',
  type: { name: 'internal', bankCode: 'TUB' },
  __v: 0
}
我得到的结果(称为res2)是使用扩展运算符res2={…res}返回的对象:

{
  '$__': InternalCache {
    strictMode: true,
    selected: {},
    // alot of key-value
    '$setCalled': Set(0) {},
    ownerDocument: undefined,
    fullPath: undefined,
    emitter: EventEmitter {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: 0,
      [Symbol(kCapture)]: false
    },
    '$options': { skipId: true, isNew: false, willInit: true }
  },
  isNew: false,
  errors: undefined,
  _doc: {
    time: 2020-07-26T10:39:38.135Z,
    isTransfered: true,
    _id: 5f1d5d6b60755e75b48770a6,
    receiverAccountNumber: '12345678',
    transfererAccountNumber: '11111111',
    receiverName: 'Lê Công Tuyền',
    transfererName: 'Nguyễn Thanh Tuấn',
    amount: 1000000,
    content: "test chuyefo'seajfg",
    payFeeBy: 'transferer',
    type: { name: 'internal', bankCode: 'TUB' },
    __v: 0
  },
  '$locals': {},
  '$op': null,
  '$init': true
}
我真的不知道spread操作符的这种行为,它生成了很多新的键值,并且我想要得到的对象位于
\u doc
key中


代码在nodejsv12上运行(nvmuse12)

这可能是因为这里的res是一个具有这些值的mongoose文档

默认情况下,当您执行mongoose查询时,它将返回一个文档对象。要接收普通对象,请使用
lean()
。如果您使用精益,那么在使用spread运算符时就不会得到这些不必要的数据

Schema.findOne(query).lean()
但是,如果您需要来自mongoose的document对象,那么在这种情况下,您可以尝试以下方法来删除不需要的其他值

 let res2 = { ...res.toObject() };

这可能是因为这里的
res
是一个mongoose文档,它具有这些值

默认情况下,当您执行mongoose查询时,它将返回一个文档对象。要接收普通对象,请使用
lean()
。如果您使用精益,那么在使用spread运算符时就不会得到这些不必要的数据

Schema.findOne(query).lean()
但是,如果您需要来自mongoose的document对象,那么在这种情况下,您可以尝试以下方法来删除不需要的其他值

 let res2 = { ...res.toObject() };

如果您想要
res.\u doc
您不需要使用
这与Express无关,而是与mongoose有关。您的“原始对象”不是普通对象,而是mondodb
Document
实例,以及当您
console.log
时它呈现的内容。它不是对象实际包含的内容。使用
.toObject()
。如果您想要
res.\u doc
您不需要使用
这与Express无关,而是与mongoose有关。您的“原始对象”不是普通对象,而是mondodb
Document
实例,以及当您
console.log
时它呈现的内容。它不是对象实际包含的内容。使用
.toObject()
。是的,res是我的猫鼬产品!是的,这是我的猫鼬蛋!