Node.js中更新嵌套对象时如何避免数据丢失?
Node.js中更新嵌套对象时如何避免数据丢失?
看起来你遇到的问题是在更新嵌套对象时,不小心弄丢了原有的input字段和output里的netDieCutWeightWithAccessories字段对吧?我来帮你分析问题出在哪,以及给出几种解决办法。
问题根源
你当前的写法是重新创建了一个全新的bagWeight对象并赋值给原对象,虽然用了扩展运算符...来尝试保留原有字段,但因为你操作的是Mongoose文档对象(不是普通JS对象),扩展运算符可能无法正确复制嵌套文档的所有属性;另外,这种写法如果稍有疏忽(比如漏写某个字段),就会导致原有字段丢失。
解决办法
方法一:直接修改嵌套属性(最简单稳妥)
既然你只需要更新bagWeight.output里的两个字段,完全不需要重新构造整个bagWeight对象,直接修改对应的属性即可,这样其他原有字段会自动保留:
const calculateWeightSingleBag = (productionSheet) => { // ... 所有计算逻辑保持不变 // 直接修改需要更新的属性,不替换整个对象 productionSheet.bagWeight.output.bareWeight = { value: bareWeight, cost: false, unit: "g" }; productionSheet.bagWeight.output.netDieCutWeight = { value: netDieCutWeight, cost: false, unit: "g" }; console.log("After bagweight: ", productionSheet.bagWeight); return productionSheet; };
这样修改后,原有的bagWeight.input和bagWeight.output.netDieCutWeightWithAccessories都会被保留,完全不会丢失数据。
方法二:正确展开所有嵌套属性(适合需要批量更新的场景)
如果之后需要更新更多字段,必须重新构造对象的话,要确保先展开整个原有对象,再覆盖需要修改的部分,同时要把Mongoose文档转换成普通JS对象,避免特殊行为:
const calculateWeightSingleBag = (productionSheet) => { // ... 所有计算逻辑保持不变 // 将Mongoose嵌套文档转成普通JS对象,确保扩展运算符能正确复制所有属性 const originalBagWeight = productionSheet.bagWeight.toObject(); // 先展开原有整个bagWeight,再覆盖output里的目标字段 productionSheet.bagWeight = { ...originalBagWeight, // 保留原有的input和所有output字段 output: { ...originalBagWeight.output, // 保留原output的其他字段 bareWeight: { value: bareWeight, cost: false, unit: "g" }, netDieCutWeight: { value: netDieCutWeight, cost: false, unit: "g" }, }, }; console.log("After bagweight: ", productionSheet.bagWeight); return productionSheet; };
验证效果
修改后再运行代码,你的After bagweight日志应该会和预期一致,包含完整的input字段和output里的所有原有字段。
备注:内容来源于stack exchange,提问作者Alessio Canna
相关产品推荐
相关产品推荐

