【问题标题】:Increment/ Decrement a value in firebase realtime database with in NodeJS在NodeJS中增加/减少firebase实时数据库中的值
【发布时间】:2021-12-31 21:34:48
【问题描述】:

我想在我的 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 实时数据库中的数据已成功递减,应用程序崩溃并产生以下错误。 Pastebin Link Of Error Message On Console

【问题讨论】:

  • 错误是什么?将其包含在帖子中
  • 这是一个很长的错误,所以我在底部添加了一个 pastebin 链接。

标签: javascript node.js firebase


【解决方案1】:
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 或类似方法读取一次值,然后更新您的值

注意:- 更好的方法是使用事务

【讨论】:

    【解决方案2】:

    您正在通过调用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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2021-10-06
      • 2013-04-08
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多