typescript - 部署云功能时如何传递证书密钥文件?
问题描述
在我的 TypeScript 文件中,我有以下内容:
import * as admin from 'firebase-admin'
import * as functions from 'firebase-functions'
const serviceAccountKey = "serviceAccountKey.json"
const databaseURL = "https://blahblah.firebaseio.com"
admin.initializeApp({
credential: admin.credential.cert(serviceAccountKey),
databaseURL: databaseURL
});
我的函数在模拟器中运行良好(只有成功传递了 json 密钥才会发生这种情况)但是当我尝试部署它们时,出现以下错误:
Error: Error occurred while parsing your function triggers.
Error: Failed to parse certificate key file: Error: ENOENT: no such file or directory, open 'serviceAccountKey.json'
我尝试将 json 文件移动到根文件夹、lib 文件夹(index.js 文件所在的位置)、functions 文件夹,但没有任何运气。部署时如何传递密钥?
解决方案
当您使用 Firebase CLI 将内容部署到 Cloud Functions 时,它将上传您的函数文件夹的全部内容(node_modules 除外,它将使用您的 package.json 的内容进行重建)。该文件夹将成为您部署的根目录。当您的函数执行时,它将准备好所有这些文件以供使用,但您必须使用相对路径正确引用它们。
以此为视角,我可以看到您的 serviceAccount.json 和编译后的 index.js 都在一个名为“lib”的文件夹中。如果您希望 index.js 中的代码能够从同一文件夹中的其他文件中加载 JSON,您需要做的是使用相对路径引用它,如下所示:
const serviceAccountKey = "./serviceAccountKey.json"
请注意路径开头的“./”。这告诉节点您要引用与当前源文件位于同一文件夹中的文件。
我将提出一项建议:对于 TypeScript 项目,lib 通常保留用于已编译的代码。我会避免将您的服务帐户文件放在那里,因为可以在干净构建期间删除该文件夹。最好将其放在部署的根目录中并将其称为“../serviceAccount.json”,这是我通常的做法。
推荐阅读
- android - 如何使用 Kotlin 在片段内播放 YouTube 视频
- java - 构造函数中的对象创建链接 wrt 继承
- apache-kafka - 即使 Kafka 连接断开,应用程序也应该继续运行
- javascript - 我想验证用户的伪在他写作时是否良好
- sql - 日期范围之间的日期范围
- javascript - 使用 Gremlin Javascript 在 JanusGraph 中创建和查询 Geopoint
- terraform - Terraform 在初始化期间将资源列为提供者
- ios - 为 iOS 12 开发的应用程序可以安装在 iPadOS 上吗
- python - Pandas:如何从 google drive public 读取 CSV 文件?
- javascript - 推断嵌套的通用参数并从函数中返回它