![](/img/trans.png)
[英]Increment/Decrement Function with Firebase Realtime Database using vuejs
[英]Increment/ Decrement a value in firebase realtime database with in NodeJS
我想在我的 firebase 实时数据库中设置一个计数器。 在我的应用程序中尝试使用它来计算 API 请求的数量。 下面是从我的应用程序中提取的最短和最简单的代码,它的工作原理与我的应用程序完全相同并产生相同的错误。
我的 firebase 实时数据库的结构:
Counter: 1000
我的代码(indd.js):
require('dotenv').config();
const admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://awesomeURL.firebaseio.com"
});
const database = admin.database();
const rw = () => {
const path = "Counter";
database.ref(path).on("value", snapshot => {
database.ref(path).set(snapshot.val() - 1);
console.log(snapshot.val())
});
}
rw();
我的package.json文件的内容
"name": "api",
"version": "1.0.0",
"description": "All my APIs.",
"main": "indd.js",
"dependencies": {
"dotenv": "^10.0.0",
"firebase-admin": "^8.6.1"
},
"scripts": {
"start": "nodemon indd.js"
},
"engines": {
"node": ">=12"
}
}
我的.env文件的内容。
所需的 json 文件可在项目概述⚙️ > 服务帐户 > 生成新私钥中找到
GOOGLE_APPLICATION_CREDENTIALS =./adminsdk.json
结果:
firebase 实时数据库中的数据成功递减,应用程序崩溃并产生以下错误。 控制台上的错误消息的粘贴bin链接
database.ref(path).on("value", snapshot => {
database.ref(path).set(snapshot.val() - 1);
console.log(snapshot.val())
});
因此on
只要您更新值,就会立即触发方法,这会再次更新值,所以这是创建一个循环
update value -> on method fired -> update value -> on method fired ->..... infinite.
不要使用on
方法,而是使用 get 或类似方法读取一次值,然后更新您的值
注意:- 更好的方法是使用事务
您通过调用on
将永久侦听器附加到Counter
上。 因此,您的代码将使用计数器的初始值调用一次,然后每次更改计数器。
而且由于您的回调代码更改了计数器,这将导致回调被再次调用......一次又一次......一次又一次,直到你得到你得到的错误。
要增加值,您应该只获取当前值,而不是侦听更新,您可以使用once()
而不是on()
来做到这一点:
const rw = () => {
const path = "Counter";
// 👇
database.ref(path).once("value", snapshot => {
database.ref(path).set(snapshot.val() - 1);
console.log(snapshot.val())
});
}
rw();
但是现在通过使用原子服务器端增量操作可以更容易(并且更安全)地增加现有值:
const rw = () => {
const path = "Counter";
// 👇 👇
database.ref(path).set(firebase.database.ServerValue.increment(1));
}
rw();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.