gpt4 book ai didi

javascript - 如果我的数据库中具有相同的值,如何拒绝将值写入 Firebase? (Javascript)

转载 作者:行者123 更新时间:2023-12-02 22:11:55 25 4
gpt4 key购买 nike

我正在为我的项目创建带有自动增量生成器功能的自定义订单 ID。我在这里陈述我的问题,如果你想了解整个故事请阅读下面。

正如标题中所写,我需要一种方法来拒绝我的 set到 Firebase,它必须在 1 个查询中完成。目前,它会将我的 orderID 写入 Firebase,而不拒绝它。但如果表中存在相同的 ID,我需要拒绝。

我的代码的简短版本将发布在这里,整个功能将发布在下面。

  firebase.database().ref('orderCounter/orderIDsChecker/'+orderID).set({
id: orderID,
}, function(error) {
if (error) {
console.log('Order ID fail to generate. Regenerating new ID')
createOrderID(orderCounterRef);
} else {
console.log('Order ID created!')
}
});
}

故事

我正在为我的项目创建带有自动增量生成器功能的自定义订单 ID。问题是如果多个用户同时创建订单,就会生成相同的id。是的,我可以使用transaction()解决问题,但我不知道如何使用它。因此,我创建了我自己的“交易”版本。使用我的方法,我能够防止重复的 id,除非 2 个或更多用户在间隔 1 秒内创建订单。或者,如果有人好心地向我展示如何为我的函数编写交易的示例,我提前感谢您。

代码的流程是,

从 Firebase 获取“currentMonth”和“orderIdCounter” -> orderIdCounter +1 并更新到 Firebase -> 开始生成订单 id 的过程 -> 将生成的 id 发送到 firebase -> 如果返回成功“订单 ID 创建”,如果不是“有重复的 id”,请重新运行整个过程。

下面是我的订单 ID 生成器函数的代码。

function createOrderID(orderCounterRef){
var childData = [];
var orderID;

//Get the Current Month and Order ID Counter from Firebase
orderCounterRef.on('value', function(snap) { childData = snapshotToArrayWithoutID(snap); });

var currentMonth = childData[0];
var orderIDCounter = childData[1];

if (orderIDCounter !== undefined){
//Update orderIDCounter on Firebase.
//This is to prevent duplicate orderID when multiple users is creating order at the same time.
var IDCounter = parseInt(orderIDCounter) + 1;
//Set IDCounter to 3 digits
IDCounter = ('00' + IDCounter.toString()).slice(-3);
firebase.database().ref('orderCounter/orderIDCounter').set(IDCounter);

//Handle the process to generate Order ID. Return in YYMMxxx(auto increment) format.
orderID = handleCreateOrderID(currentMonth, (parseInt(orderIDCounter) - 1));

//Check if duplicate ID on firebase
firebase.database().ref('orderCounter/orderIDsChecker/'+orderID).set({
id: orderID,
}, function(error) {
if (error) {
console.log('Order ID fail to generate. Regenerating new ID')
createOrderID(orderCounterRef);
} else {
console.log('Order ID created!')
}
});
}
return orderID;
}

我的数据库:

DB Screenshot

最佳答案

你确实应该使用transaction正如您在问题中提到的。

以下应该可以解决问题:

  //Declare a function that increment a counter in a transaction
function createOrderID() {
var orderIdRef = firebase.database().ref('orderId');
return orderIdRef.transaction(function(currentId) {
return currentId + 1;
});
}


//Call the asynchronous createOrderID() function
createOrderID().then(function(transactionResult) {
console.log(transactionResult.snapshot.val());
});
<小时/>

如果您想以特定值启动计数器,只需在数据库中创建一个 orderId 节点并为其分配一个特定值,例如; 1912000

如果您只想从 1 开始,则无需创建节点,第一次调用 createOrderID() 函数时会自动创建节点。

关于javascript - 如果我的数据库中具有相同的值,如何拒绝将值写入 Firebase? (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59530296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com