【问题标题】:How do I use Firebase Admin SDK to change data in Firebase Realtime Database while using Cloud Functions?如何在使用 Cloud Functions 时使用 Firebase Admin SDK 更改 Firebase 实时数据库中的数据?
【发布时间】:2021-04-04 06:41:47
【问题描述】:

我想在每天凌晨 12:00 重置我的 Firebase 实时数据库中的特定值。为此,我使用 Firebase Admin SDK 更改 Firebase 实时数据库和 Cloud Functions 中的数据,以在每天凌晨 12:00 触发更改。

这是我的 Firebase 实时数据库的示例结构:

{
  "users": {
    "fa54487d9cbb4214b00db80e2118e4e6": {
      "daily": 10
    }
  }
}

这是我index.js中的代码:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
var functions = require('firebase-functions');

// The Firebase Admin SDK to access Cloud Firestore.
var admin = require('firebase-admin');

// Fetch the service account key JSON file contents
var serviceAccount = require("serviceAccountKey.json");

// Initialize the app with a service account, granting admin privileges
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://databaseName.firebaseio.com"
});

// As an admin, the app has access to read and write all data, regardless of Security Rules
var db = admin.database();
var ref = db.ref("users");

// Reset today GHG emissions at 12:00 AM everyday
exports.dailyReset = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    usersRef.child("{userId}").set({
      daily: 0
    });
});

部署错误:

! functions[dailyReset(us-central1)]: 部署错误。

函数加载用户代码失败。这可能是由于用户代码中的错误。错误消息:错误:请检查您的函数日志以查看错误原因:https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs。可以在https://cloud.google.com/functions/docs/troubleshooting#logging 找到其他故障排除文档。请访问https://cloud.google.com/functions/docs/troubleshooting 获取深入的故障排除文档。

Firebase 控制台功能日志:

错误:函数终止。建议的操作:检查日志以了解终止原因。

其他故障排除文档可以在https://cloud.google.com/functions/docs/troubleshooting#logging 找到函数无法初始化。

{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"函数加载用户代码失败。这是可能是由于用户代码中的错误。

错误消息:错误:请检查您的函数日志以查看错误原因:https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

可以在https://cloud.google.com/functions/docs/troubleshooting#logging 找到其他故障排除文档。

当我使用 firebase deploy 时,脚本不会部署,因为我的函数给了我一个错误。谁能告诉我如何修复我的代码?

【问题讨论】:

  • 错误信息告诉你去哪里找到控制台中的实际错误。
  • @DougStevenson 您是在谈论来自 Firebase 控制台的日志错误消息吗?如果你是,我现在就在我的帖子中包含了它。

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

这行不通:

exports.dailyReset = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    usersRef.child("{userId}").set({
      daily: 0
    });
});

这里没有解释该路径中的{userId},因此数据库会更新文字路径"/users/{userId}",这不是您想要的。

如果您知道要更新的用户 ID,则应在路径中使用该值:

exports.dailyReset = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    let usersRef = admin.database().ref("users");
    usersRef.child("theActualUserIdYouWantToUpdate").set({
      daily: 0
    });
});

如果您不知道要更新哪个用户 ID,则需要query the database 来确定。


如果你想遍历所有用户,你可以这样做:

exports.dailyReset = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    return usersRef.once("value").then((snapshot) => {
        let updates = {};
        snapshot.forEach((userSnapshot) => {
            updates[userSnapshot.key+"/daily"] = 0
        });
        return usersRef.update(updates);
    });
});

如果您不熟悉 JavaScript 或与其中的实时数据库交互,Cloud Functions for Firebase 并不是学习它的最佳方式。我建议先阅读Firebase documentation for Web developers 和/或阅读Firebase codelab for Web developer。它们涵盖了许多基本的 JavaScript、Web 和 Firebase 交互。您还可以在本地 Node.js 进程中使用 Admin SDK,该进程可以使用本地调试器进行调试。完成这些之后,您将能够更好地为 Cloud Functions 编写代码。

【讨论】:

  • 另外你必须返回set()返回的promise。
  • 由于我必须为所有用户重置值,所以我不知道具体的用户 ID。我会 orderByChild()orderByKey()orderByValue() 这样做吗?
  • 我添加了一个如何循环遍历所有用户节点的示例。
  • 我应该用ref替换usersRef吗?我之前从未创建过usersRef,所以我认为这也可能是一个问题。我也收到了error Parsing error: Unexpected token { 你的代码。
  • 我现在修复了这两个问题,但老实说:我高度建议您首先尝试学习如何以不同的方式与数据库交互,因为这些是在您尝试在此处实现的用例类型之前,您应该能够自行修复错误。
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 2019-10-03
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多