我正面临一个有点奇怪的情况,我找不到原因。我是我的服务器更新订单端点,我可以接收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'
,相应地,属性isPromotion
为true
或false
时,我首先更新Product
和Promotion
记录,然后在上述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);