首页 > 解决方案 > 部署云功能时如何传递证书密钥文件?

问题描述

在我的 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 文件夹,但没有任何运气。部署时如何传递密钥?

在此处输入图像描述

标签: typescriptfirebasegoogle-cloud-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”,这是我通常的做法。


推荐阅读