繁体   English   中英

在 NodeJS 中增加/减少 firebase 实时数据库中的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM