【发布时间】:2022-01-24 17:14:10
【问题描述】:
我们有一个使用 Vuejs 和 Cloud Firestore(客户端库 Web 版本 9)的预订应用程序。
场景:两个客户同时访问我们的预订网站,并尝试同时预订最后一个可用的套餐。为了保存预订,我们使用了 Firestore 交易。但是,如果我们尝试从两个设备预订最后一个包裹并“同时”点击提交按钮,则下面的代码允许同时接受两个订单。此外,包裹“已售”字段仅增加。我们有什么办法可以改进以下代码以防止超额预订?
const packageDocRef = doc(db, ...);
try {
const orderId = await runTransaction(db, async (transaction) => {
const packageDoc = await transaction.get(packageDocRef);
if (!packageDoc.exists()) {
throw "Package does not exist!";
}
const quantity = packageDoc.data().quantity;
const sold = parseInt(packageDoc.data().sold + 1);
if (quantity >= sold) {
transaction.update(packageDocRef, { sold: increment(1) });
const orderRef = await addDoc(collection(db, collections.ORDERS), reservation);
if(orderRef.id){
dispatch ("saveTravellerDetails", { orderId: orderRef.id });
return orderRef.id;
}else{
throw "Error saving reservation!";
}
} else {
return Promise.reject("Sorry! Not enough spots available.");
}
});
console.log("Reservation created ");
return { orderId: orderId };
} catch (e) {
// This will be a "Not enough spots available" error.
console.error(e);
return { error: e };
}
【问题讨论】:
标签: javascript firebase google-cloud-firestore