当前位置: 首页 > 知识库问答 >
问题:

如何使用Firebase Admin SDK在使用Cloud Functions时更改Firebase实时数据库中的数据?

衡子安
2023-03-14

我想每天上午12:00重置Firebase实时数据库中的特定值。为此,我使用Firebase Admin SDK更改Firebase实时数据库和云函数中的数据,以便每天上午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
    });
});

部署错误:

! 函数[DailReset(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部署时,脚本不会部署,因为我的函数给我一个错误。有人能告诉我如何修复我的代码吗?

共有1个答案

穆招
2023-03-14

这行不通:

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

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

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

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

如果您不知道要更新哪个用户ID,则需要查询数据库以确定该用户ID。

如果要循环遍历所有用户,可以执行以下操作:

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或与其中的实时数据库交互,那么Firebase的云函数并不是学习它的最佳方式。我建议您先阅读Firebase文档(适用于Web开发人员)和/或学习Firebase codelab(适用于Web开发人员)。它们涵盖了许多基本的JavaScript、Web和Firebase交互。您还可以在本地节点中使用AdminSDK。js进程,可以使用本地调试器进行调试。在这些之后,您将更好地为云函数编写代码。

 类似资料:
  • setInterval(beta,1000);} 函数beta(){ var d=document.getElementById(“opopo”).value; $(“table tbody”)。追加(“+插槽+”+“分配+”+“+日期+”+“+限制+”+“+时间+”null“);}); }

  • 我有一个带有读数的数据库集合,每个新读数都需要检查,如果它不寻常,如果是,则需要发送警报。 所以我使用

  • 我是说 现在我可以得到这个房间的孩子了,但是我想知道是否有一种方法可以使用来完成同样的事情。

  • 我正在使用Flutter,我想从我的实时数据库Firebase中检索一些数据。我的实时数据库Firebase中存储了以下数据: 如何从中获取每一条信息?例如,我只想得到“Tom”这个名字?

  • 问题内容: MySQL的时区为“ GMT + 8”,而Tomcat的时区为“ GMT”。当我将 datetime 保存到数据库中时,一切似乎都正常,但是当我检查数据库中的 datetime 值时,看到了“ GMT”值。 另外,当我尝试从数据库中获取值时,值已更改,好像数据库中的值被视为“ GMT + 8”,因此Java将值更改为“ GMT”。 我已经这样设置了连接URL: 但它不起作用。 问题答案

  • 每当我使用Admin SDK从Node运行Firebase实时数据库代码时,进程都会挂起。例如,我可能有一个节点应用程序: 我使用运行。用户将设置为不活动,这很好。但是节点进程将挂起。我必须按ctrl-c才能返回提示。 我应该使用Firebase在节点应用程序中关闭连接或执行其他操作吗?对于Firebase函数,我必须返回从上述调用生成的promise。那么,Firebase函数是否自动处理关闭我