#javascript #node.js #firebase #google-cloud-functions
#javascript #node.js #firebase #google-cloud-функции
Вопрос:
Я использую firebase в качестве базы данных для моего мобильного приложения, созданного с использованием react native. В одном из сценариев мне нужно проверить, что, если дочерний элемент уже представлен? если не создать новый дочерний элемент, еще обновите существующий дочерний элемент.
У меня есть дерево с именем «CouponUsage», и в нем есть все пользователи, которые использовали код купона.
Структура дерева выглядит следующим образом:
-CouponUsage
-user1
-coupon1: 0 // couponcode name and Number of times used
-user2
-coupon1: 2
-coupon2: 0
Итак, чего я хочу, так это проверить, существовали ли уже «пользователь1» или «пользователь2»? И если они не существуют, должна быть создана новая запись с «user1» или «user2» с соответствующим кодом купона, который они ввели.
Весь сценарий заключается в том, что пользователь вводит код купона в приложении, и я проверяю код, а затем, как только он будет правильным, код купона будет отправлен в облачную функцию Google, и тогда произойдет то, о чем говорилось выше. Итак, как только пользователь введет код купона (у каждого кода купона есть отдельный лимит использования пользователем), код будет отправлен, и функция должна проверить, существует ли «user1», и если существует, введенный пользователем код уже существует? И если это существует, то просто обновите счетчик, иначе создайте «user1» и добавьте дочерний элемент «coupon1» (купон, введенный пользователем), а затем запустите счетчик с 1.
Вот мой код для облачной функции Google на данный момент! :
if(usersCouponUsage) {
await admin.database().ref(`couponUsage/${phone}`)
.update({ [couponCodeName]: usersCouponUsage 1 });
}
Это явно обновляет количество, если я также передаю количество. Как реализовать вышесказанное в firebase?
Ответ №1:
На самом деле это довольно просто. Поскольку вы обновляете счетчик, вам следует использовать транзакцию, которая, «изменяя существующее значение на новое значение», «гарантирует отсутствие конфликтов с другими клиентами, выполняющими запись в одно и то же местоположение в одно и то же время».
Хорошей новостью является то, что транзакция автоматически обработает случай, когда пара пользователь / купон не существует.
Вот код для включения в вашу облачную функцию:
.....
const user = 'user1'; //Set the user
const coupon = 'coupon1' //Set the coupon
const couponUsageRef = admin.database().ref('CouponUsage/' user '/' coupon);
return couponUsageRef.transaction(currentNbr => {
return currentNbr 1;
});
.....
Если вы хотите протестировать транзакцию вне облачной функции, просто скопируйте / вставьте следующий код в HTML-файл, который вы можете сохранить локально, измените элементы конфигурации Firebase на свои собственные и откройте его в браузере.
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, user-scalable=yes">
<script src="https://www.gstatic.com/firebasejs/5.9.0/firebase.js"></script>
</head>
<body>
<script>
var config = {
apiKey: "--yourValue--",
authDomain: "--yourValue--",
databaseURL: "--yourValue--",
projectId: "--yourValue--"
};
firebase.initializeApp(config);
var user = 'user1';
var coupon = 'coupon2'
var db = firebase.database();
var couponUsageRef = db.ref('CouponUsage/' user '/' coupon);
couponUsageRef.transaction(function(currentNbr) {
return currentNbr 1;
});
</script>
</body>
</html>
Комментарии:
1. что в этом currentNbr? поскольку структура выглядит как «couponCodeName»:»0″,
2.
currentNbr
это просто переменная, которая содержит текущие данные, хранящиеся в этом расположении, и которая передается функции, используемой в качествеtransactionUpdate
параметра транзакции. Все это объясняется в документации, на которую я ссылаюсь в своем ответе. Вы можете использовать любое имя переменной и изменить его, например, сcurrentNbr
наcurrentValue
илиxyz
.3. Понял, если пользователь не представлен или код купона не представлен под определенным пользователем. Будет ли транзакция создавать их автоматически?
4. Да, это произойдет. Я бы посоветовал вам протестировать его из HTML-кода, который я добавил к своему ответу. Просто сохраните его локально в виде HTML-файла и поиграйте с ним в браузере, изменив значения user и coupon и обновив браузер. Вы увидите, что оно удовлетворяет всем вашим потребностям.
5. Я пробовал, там нет никакой ошибки или каких-либо изменений. Я не смог найти, что не так? И все же я не могу понять, как это работает, если раньше не было никакой записи. Поскольку мы увеличиваем, как оно будет увеличиваться, если раньше не было никакого значения?