javascript - 使用 NodeJS 增加/减少 firebase 实时数据库中的值

标签 javascript node.js firebase

我想在我的 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/

相关文章:

android - 如何检查 Firebase 存储中是否存在图像?

javascript - 在 AngularJS 上使用 Dragular 进行移动滚动

javascript - HTMLElement 和 HTMLDocument 的通用接口(interface)?

node.js - 如何预加载MongoDB文档?

node.js - 按 2 个字段搜索 mongoDB

javascript - 使用 Cloud Functions Request/Express 创建新帐户

android - 如何更改 Kotlin 属性的名称以匹配 Firebase 数据库上的字段

javascript - 在 AngularJS 的自定义指令中包含第一个子 html

javascript - 重写 Javascript 函数?

javascript - 将 koa 插件添加到 eggjs 框架