firebase - Firebase Admin SDK 不读取、写入或抛出错误 (Node.js)
问题描述
此问题之前已关闭,告诉我“更新问题,使其仅关注一个问题;” 我不知道问题是什么,如果我这样做了,我就不会发布这个问题。无论如何,我将在这里做一些澄清:
我以前只使用普通的 Firebase 模块(使用“npm i firebase”导入的模块);之前一切都很完美。该问题与 Firebase Admin SDK 的身份验证(据我所知)有关。我不明白我应该如何将它发送到 Heroku 构建而不显示我的 GitHub 上的服务帐户密钥 JSON 文件。
至于 GOOGLE_APPLICATION_CREDENTIALS 路径,有没有一种方法可以让我不必在每个会话中都设置它?Heroku 应用程序每天重新启动一次,我需要以某种方式自动执行此输入过程(或完全跳过它)。这就是我目前的理解方式。以下是上一个答案的引述:
当我设置 GOOGLE_APPLICATION_CREDENTIALS 路径时,这不只是在我的本地机器上设置它吗?
环境变量仅适用于已设置它们的单个机器和进程。如果您希望将其设置在另一台机器和进程上,则必须单独安排。根据文档:
将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含您的服务帐号密钥的 JSON 文件的文件路径。此变量仅适用于您当前的 shell session,因此如果您打开一个新会话,请再次设置该变量。
我的主要问题如下:“我错误地实现了 Firebase Admin SDK。我该如何以正确的方式做到这一点?”
即使只是发布一个指向有帮助的指南的链接也将不胜感激(尽管我知道这通常是不鼓励的,因为链接有时会中断)。
原来的:
注意:这是我第一次使用 Firebase Admin SDK,所以我真的不确定我在做什么(虽然我已经使用了很多 Firebase)。
最近,我决定回到我的一个旧的 Discord 机器人,并正确地验证它对 Firebase 的请求(我以前没有这样做过,因为我以前从未从服务器进行过身份验证,并且认为这是不可能的) . 我发现了 Firebase Admin SDK,它听起来非常适合我的需求(该机器人托管在 Heroku 上,作为记录)。
我找到了这个指南:https ://firebase.google.com/docs/admin/setup ,但是有一些事情我无法理解(请注意,这些纯粹是修辞,你不需要回答它们在您的回答中;我只是提供它们,以便您了解我的思维过程):
- 当我设置 GOOGLE_APPLICATION_CREDENTIALS 路径时,这不只是在我的本地机器上设置它吗?我也可以尝试在服务器上运行导出命令(在 CLI 中使用“heroku run”),但路径将指向服务器上不存在的文件(因为服务帐户密钥 JSON 文件已打开我的本地机器)。我需要在 Heroku 中设置一个环境变量吗?
- “admin.credential.applicationDefault()”如何知道如何获取凭证?
我找不到任何其他有意义的指南。
我目前设置它的方式一定是错误的,因为读取和写入会静默失败。
Firebase 设置代码:
// Setup Firebase:
const admin = require('firebase-admin');
// Initialize Firebase:
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://<APP>.firebaseio.com" // I removed the actual <APP> name to ask this question
});
let database = admin.database();
诸如database.ref("test").set("Hello World!");
不要更改数据库中的数据之类的事情,并且不会引发任何错误(我也尝试在此末尾附加一个 .then 和一个 .catch ;仍然没有)。这是在我切换到 Firebase Admin SDK 之前工作的(我之前只是使用“firebase”模块,而不是我现在使用的“firebase-admin”模块)。读取数据也是如此。
任何帮助,将不胜感激。
解决方案
这是我的问题:
我res.status(200)
在异步 firebase 调用之外发送,在 firebase 有机会完成之前终止了请求。不知何故 localhost 允许它正常工作,但是当它托管的东西横向运行时。
所以我有这个
fireabse.database().ref('parent/foo').set('bar');
res.status(200)
我需要这个:
firebase.database().ref('parent/foo').set('bar').then(() => {
res.status(200);
});
推荐阅读
- bash - 如何更改我的 bash_profile 以读取和公开我已经在某些脚本文件中定义的所有 func() ?
- javascript - 代码中需要更正哪些内容才能使其在智能手机上运行?
- cordova - Cordova VueJs Webpack 延迟加载在生产中失败
- python - 如何将数据权重包含到 Scipy NNLS 函数中?
- mysql - mysql插入忽略多行插入中已经可用的行
- python - IndexError:字符串索引超出范围 - Python
- html - 在反应材料-ui按钮中自动调整字体大小以获取意外的长内容?
- python - 从python脚本在flutter应用程序中显示数据的有效方法
- android - 无法使用 Flutter 将文件上传到 FirebaseStorage
- c - 我们的 C 代码中用于 CFS 调度的示例代码