gpt4 book ai didi

node.js - 在 mongoose 结果上使用 lodash cloneDeep() - 无法更新生成的 JSON

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:51 24 4
gpt4 key购买 nike

使用的技术:Node.js、Express、Mongoose、Mocha、lodash

在测试我的服务时,我的应用程序:

  1. 使用 Mongoose 保存新文档获取结果
  2. 使用 lodash.cloneDeep() 克隆结果
  3. 尝试更改克隆实例的内容

结果是我得到了一个处于非常奇怪状态的克隆文档。当尝试修改值时,如果我查询已更改的特定对象的值,它会显示正确的值。但是,当我将文档本身转储到控制台时,就好像我没有更新这些值一样。同样,如果我将文档传递到保存例程中,它会将文档保存到 MongoDb,就好像我没有更改任何值一样。

这是代码:

测试代码:

describe('### UPDATE ALARM', function () {
it('Should save an alarm record for newly created asset', async () => {
var asset = await Asset.findOne({ _id: compAdminAsset })
const req = { user: { _id: compAdminId } }
var alarm = await AlarmController.getByAsset(req, asset)
expect(alarm._user).to.be.equal(compAdminId)
expect(alarm._asset).to.be.equal(compAdminAsset)

var newAlarm = _.cloneDeep(alarm)
console.log('#### Newly Cloned Alarm Object')
console.log(newAlarm)

// change the rhSettings values
newAlarm.rhSettings.rhAlarmLow = true
newAlarm.rhSettings.rhAlarmHigh = true
newAlarm.rhSettings.rhLow = 40
newAlarm.rhSettings.rhHigh = 85

console.log()
console.log('#### Cloned Alarm Object AFTER updating values')
console.log(newAlarm)

console.log()
console.log('#### Directly query the values that were changed ')
console.log('newAlarm.rhSettings.rhAlarmLow: ' + newAlarm.rhSettings.rhAlarmLow)
console.log('newAlarm.rhSettings.rhAlarmHigh: ' + newAlarm.rhSettings.rhAlarmHigh)
console.log('newAlarm.rhSettings.rhLow: ' + newAlarm.rhSettings.rhLow)
console.log('newAlarm.rhSettings.rhLow: '+ newAlarm.rhSettings.rhHigh)

var savedAlarm = await AlarmController.update(req, newAlarm)
.
.
.
})
})

测试代码的输出:

    ### UPDATE ALARM
#### Newly Cloned Alarm Object
{ rhSettings:
{ rhLow: 0, rhHigh: 80, rhAlarmLow: false, rhAlarmHigh: false },
tempSettings:
{ tempLow: 50,
tempHigh: 100,
tempAlarmLow: false,
tempAlarmHigh: false },
_user: 'c86a7618-2323-48ec-b9e0-0d953301e37f',
_asset: '6ca7a1ba-fc16-4cbf-9b4d-029c508d6b6c',
_id: 5bde26a5038bec31683b8d80,
createdAt: 2018-11-03T22:52:21.604Z,
updatedAt: 2018-11-03T22:52:21.604Z,
__v: 0 }

#### Cloned Alarm Object AFTER updating values
{ rhSettings:
{ rhLow: 0, rhHigh: 80, rhAlarmLow: false, rhAlarmHigh: false },
tempSettings:
{ tempLow: 50,
tempHigh: 100,
tempAlarmLow: false,
tempAlarmHigh: false },
_user: 'c86a7618-2323-48ec-b9e0-0d953301e37f',
_asset: '6ca7a1ba-fc16-4cbf-9b4d-029c508d6b6c',
_id: 5bde26a5038bec31683b8d80,
createdAt: 2018-11-03T22:52:21.604Z,
updatedAt: 2018-11-03T22:52:21.604Z,
__v: 0 }

#### Query the values that were changed directly
newAlarm.rhSettings.rhAlarmLow: true
newAlarm.rhSettings.rhAlarmHigh: true
newAlarm.rhSettings.rhLow: 40
newAlarm.rhSettings.rhLow: 85

返回“newAlarm”对象的代码:

const Model = require('../models/alarm.model')

exports.getByAsset = async function (req, asset) {
let newAlarm = new Model()
newAlarm._asset = asset._id
newAlarm._user = req.user._id
newAlarm.rhSettings = asset.rhSettings
newAlarm.tempSettings = asset.tempSettings
return await newAlarm.save()
}

有什么想法导致克隆的 JSON 对象处于这种奇怪的状态吗?

最佳答案

为了让 Mongoose 对更改跟踪等感到满意,您将使用的方法是使用 set .

但是,我非常怀疑克隆对象并使用 set 是否与最佳实践相距甚远。

为什么不简单地创建另一个模型呢?为什么要通过克隆来规避 Mongoose 中的更改跟踪等构建?

您不妨简单地使用 toObject您的新 Mongoose 模型...跳过克隆...更改值等...然后只需将该对象传递给 new Model(yourObjectWithChanges) 然后保存:

var newAlarm = alarm.toObject() 
... do your changes
let newAlarmModel = new Model(newAlarm)
await newAlarmModel.save()

关于node.js - 在 mongoose 结果上使用 lodash cloneDeep() - 无法更新生成的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53136386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com