【问题标题】:Cloud Firestore - prevent overbooking of packages or productsCloud Firestore - 防止超额预订包裹或产品
【发布时间】: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


    【解决方案1】:

    好的,我在我的方式中看到了错误。如果可以帮助其他人,我会在这里发帖。

    而不是await addDoc(collection(db, collections.ORDERS), reservation);

    我需要使用transaction.set(orderDocRef, reservation);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多