我想在我的 firebase 实时数据库中设置一个计数器。 在我的应用程序中尝试使用它来计算 API 请求的数量。 下面是从我的应用程序中提取的最短、最简单的代码,其工作原理与我的应用程序完全相同,并产生相同的错误。
我的 Firebase 实时数据库的结构:
计数器: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 实时数据库中的数据已成功递减,并且应用程序崩溃并产生以下错误。 Pastebin Link Of Error Message On Console
最佳答案
您通过调用 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();
但是现在通过使用 atomic server-side increment operation 可以更容易(也更安全)地增加现有值。 :
const rw = () => {
const path = "Counter";
// 👇 👇
database.ref(path).set(firebase.database.ServerValue.increment(1));
}
rw();
关于javascript - 使用 NodeJS 增加/减少 firebase 实时数据库中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70063153/