在循环期间更新另一个变量时更改const值



我正面临一个有点奇怪的情况,我找不到原因。我是我的服务器更新订单端点,我可以接收orderState或updatedOrder来更新MongoDB记录var { orderState, updatedOrder } = req.body;。由于我将在for循环中修改updatedOrder以更新MongoDB,我还将收到的updatedOrder分配给一个常量,稍后传递给Neo4j以进行相同的更新并创建关系,如const modifiedOrder = req.body.updatedOrder;

使用if/else语句,我要么更新MongoDB订单记录state参数或整个订单记录。在第二种情况下,当updatedOrder.cart的商品state属性被发现为'Refund requested',相应地,属性isPromotiontruefalse时,我首先更新ProductPromotion记录,然后在上述for循环中更新updatedOrder的商品状态值为Refunded

然后在for循环之后,我用更新后的updatedOrder更新Order记录。

问题是,在第一个循环之后,modifiedOrder也更新了,所以当发送到Neo4j购物车项目状态不是'Refund requested',而是'Refunded'

修改var updatedOrder的同时,const modifiedOrder的值怎么可能发生变化?即使他们从req.body.updatedOrder中获得初始值const也应该保持第一个赋值,对吗?

你能指出我做错了什么吗?

var { orderState, updatedOrder } = req.body;
const modifiedOrder = req.body.updatedOrder;
console.log(
'1> Mongoose updatedOrder received modifiedOrder.cart is',
modifiedOrder.cart
); // correct 
if (orderState) {
...
} else if (updatedOrder) {
for (var i = 0; i < updatedOrder.cart.length; i++) {
console.log(
`LOOP> Mongoose updatedOrder before loop ${i} modifiedOrder.cart is
${modifiedOrder.cart}`
); 
// at 1st loop (i = 0) CORRECT 1st item state is "Refund requested"
// at second loop (i = 1) WRONG 1st item state is now "Refunded"
var cartItem = JSON.parse(updatedOrder.cart[i]);
if (cartItem.state == 'Refund requested') {
if (cartItem.isPromotion == false) {
await Product.findByIdAndUpdate(
cartItem.id,
{
$inc: { soldQuantity: -1, availableQuantity: 1 },
},
{
session: session,
new: true,
},
null
)
.clone()
.exec()
.then((result) => {
console.log(
'Mongoose Order.updateOrder / Product.update Inventory updated successfully for product:',
result.id
);
if (result != null) {
cartItem.state = 'Refunded';
totalRefundAmount += result.price;
} else {
cartItem.state = 'Not refunded';
}
return;
})
.catch((error) => {
if (error) {
console.log(
'Mongoose Order.updateOrder / Product.update error: ',
error
);
cartItem.state = 'Not refunded';
throw error;
}
});
} else if (cartItem.isPromotion == true) {
await Promotion.findByIdAndUpdate(
cartItem.id,
{
$inc: { soldQuantity: -1, availableQuantity: 1 },
},
{
session: session,
new: true,
}
)
.clone()
.exec()
.then((result) => {
if (result != null) {
totalRefundAmount += result.price;
cartItem.state = 'Refunded';
console.log(
'Mongoose Order.updateOrder / Promotion.update Inventory updated successfully for promotion:',
result
);
} else {
cartItem.state = 'Not refunded';
}
return;
})
.catch((error) => {
if (error) {
console.log(
'Mongoose Order.updateOrder / Promotion.update error: ',
error
);
cartItem.state = 'Not refunded';
throw error;
}
});
}
}
updatedOrder.cart[i] = JSON.stringify(cartItem);
}

...
}

before 1st loop第一个项目是"退款请求":

LOOP> Mongoose updatedOrder before loop 0 modifiedOrder.cart is
{"createdOnDate":1638894572905,"name":"testProduct","brand":"someBrand","price":12,"description":"description","category":"Safety and locks","city":"Bologna","region":"Emilia-Romagna","country":"Italy","vendor":"testShop","vendorId":"OrderTestShop","barcode":"some","imageUrl":"https://firebasestorage.googleapis.com/v0/b/fix-it-b4b00.appspot.com/o/Products%2F61af8bec02edbe24ce034963?alt=media&token=a891dc05-407e-43d2-ab2b-0f49226249a9","fullImages":[],"thumbNails":[],"minimumStock":10,"availableQuantity":10,"soldQuantity":0,"isPromotion":false,"totalRating":0,"ratings":0,"_id":"636a0c9e8145999716d71de2","createdAt":"2022-11-08T08:00:30.399Z","updatedAt":"2022-11-08T08:00:30.399Z","__v":0,"averageRating":0,"id":"636a0c9e8145999716d71de2","isRecommendation":true,"state":"Refund requested"},{"createdOnDate":1638894572905,"productId":"636a0c9e8145999716d71de2","name":"testPromotion","brand":"someBrand","price":12,"description":"new description","category":"Safety and locks","city":"Bologna","region":"Emilia-Romagna","country":"Italy","vendor":"testShop","vendorId":"OrderTestShop","barcode":"some","imageUrl":"https://firebasestorage.googleapis.com/v0/b/fix-it-b4b00.appspot.com/o/Products%2F61af8bec02edbe24ce034963?alt=media&token=a891dc05-407e-43d2-ab2b-0f49226249a9","fullImages":[],"thumbNails":[],"minimumStock":10,"availableQuantity":10,"soldQuantity":0,"isPromotion":true,"totalRating":0,"ratings":0,"_id":"636a0c9e8145999716d71de4","createdAt":"2022-11-08T08:00:30.467Z","updatedAt":"2022-11-08T08:00:30.467Z","__v":0,"averageRating":0,"id":"636a0c9e8145999716d71de4","isRecommendation":true,"state":"Bought"}

第一个循环后的第一个项目是"Refunded":

LOOP> Mongoose updatedOrder before loop 1 modifiedOrder.cart is
{"createdOnDate":1638894572905,"name":"testProduct","brand":"someBrand","price":12,"description":"description","category":"Safety and locks","city":"Bologna","region":"Emilia-Romagna","country":"Italy","vendor":"testShop","vendorId":"OrderTestShop","barcode":"some","imageUrl":"https://firebasestorage.googleapis.com/v0/b/fix-it-b4b00.appspot.com/o/Products%2F61af8bec02edbe24ce034963?alt=media&token=a891dc05-407e-43d2-ab2b-0f49226249a9","fullImages":[],"thumbNails":[],"minimumStock":10,"availableQuantity":10,"soldQuantity":0,"isPromotion":false,"totalRating":0,"ratings":0,"_id":"636a0c9e8145999716d71de2","createdAt":"2022-11-08T08:00:30.399Z","updatedAt":"2022-11-08T08:00:30.399Z","__v":0,"averageRating":0,"id":"636a0c9e8145999716d71de2","isRecommendation":true,"state":"Refunded"},{"createdOnDate":1638894572905,"productId":"636a0c9e8145999716d71de2","name":"testPromotion","brand":"someBrand","price":12,"description":"new description","category":"Safety and locks","city":"Bologna","region":"Emilia-Romagna","country":"Italy","vendor":"testShop","vendorId":"OrderTestShop","barcode":"some","imageUrl":"https://firebasestorage.googleapis.com/v0/b/fix-it-b4b00.appspot.com/o/Products%2F61af8bec02edbe24ce034963?alt=media&token=a891dc05-407e-43d2-ab2b-0f49226249a9","fullImages":[],"thumbNails":[],"minimumStock":10,"availableQuantity":10,"soldQuantity":0,"isPromotion":true,"totalRating":0,"ratings":0,"_id":"636a0c9e8145999716d71de4","createdAt":"2022-11-08T08:00:30.467Z","updatedAt":"2022-11-08T08:00:30.467Z","__v":0,"averageRating":0,"id":"636a0c9e8145999716d71de4","isRecommendation":true,"state":"Bought"}
``

const obj = {
key: 'value1'
};
const objShallowCopy = obj;
const objDeepCopy = JSON.parse(JSON.stringify(obj));
obj.key = 'value2';
console.log('objShallowCopy: ', objShallowCopy);
console.log('objDeepCopy: ', objDeepCopy);

最新更新