Firebase 函数使用 GOOGLE_APPLICATION_CREDENTIALS 部署未能在全局范围内获取环境配置
Posted
技术标签:
【中文标题】Firebase 函数使用 GOOGLE_APPLICATION_CREDENTIALS 部署未能在全局范围内获取环境配置【英文标题】:Firebase functions deploy using GOOGLE_APPLICATION_CREDENTIALS failing to get an environment config on global scope 【发布时间】:2021-10-26 01:13:30 【问题描述】:我使用Service Account authentication 来部署我的firebase 功能(使用GOOGLE_APPLICATION_CREDENTIALS
变量)。这是我的脚本:
cross-env GOOGLE_APPLICATION_CREDENTIALS=./file.json firebase --project=dev deploy --only functions
这很好,它正在成功部署我的 firebase 功能。
但是,当我尝试使用 Environment configuration 时,我在尝试使用以下标准代码获取我的配置变量之一时遇到错误:
const domain = functions.config().env.domain;
这仅在此代码行在外部函数执行时发生,即在全局范围内。
这是我得到的错误:
错误:解析函数触发器时出错。 TypeError:无法读取未定义的属性“域”
重要提示:当我使用 firebase login
命令登录到 firebase 时,我没有收到此错误,只有在我退出时才会收到此错误!
我做错了什么?
谢谢!
【问题讨论】:
您能否验证您是否在哪里找到了配置参数functions.config().env.domain
?您可以查看link 了解更多详情。
@RJC 是的,它肯定存在。就像我写的那样,当我登录并执行相同的部署脚本时,它运行良好。
您是否尝试过更新您的 Firebase 版本?由于根据检查,Firebase 有更新的version。然后更新版本后,请在登录和注销时重新部署您的功能。
@RJC 我正在运行最新版本
【参考方案1】:
我已尝试复制您的代码,并且它在我这边运行良好。
这是我在 index.js 文件中包含的内容。
const functions = require("firebase-functions");
// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
exports.helloWorld = functions.https.onRequest((request, response) =>
functions.logger.info("Hello logs!", structuredData: true);
const domain = functions.config().env.domain;
response.send(domain);
);
这是我的 package.json 文件:
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts":
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "cross-env GOOGLE_APPLICATION_CREDENTIALS=./key-file.json firebase --project=[Project-ID] deploy --only functions",
"logs": "firebase functions:log"
,
"engines":
"node": "14"
,
"main": "index.js",
"dependencies":
"firebase-admin": "^9.8.0",
"firebase-functions": "^3.14.1",
"shared-types": "file:shared-types"
,
"devDependencies":
"cross-env": "^7.0.3",
"firebase-functions-test": "^0.2.0"
,
"private": true
在我退出 Firebase 时部署该功能后,我运行此 CLI 命令进行验证:firebase functions:config:get
,并得到以下结果:
"env":
"domain": "test"
由于您的错误是Cannot read property 'domain' of undefined
,因此错误似乎来自您的环境配置。您应该仔细检查开发环境/项目中的环境配置是否正确设置。为此,您应该使用 firebase functions:config:get
CLI 命令,如 documentation 中所述。你也可以查看我找到的这个similar case。
【讨论】:
你不可能从firebase functions:config:get
得到结果,如果你注销了,你应该得到这个错误:Error: Failed to authenticate, have you run firebase login?
因此我相信你没有注销因此你的部署工作。请重新检查自己。感谢您的帮助。
我能够从 firebase functions:config:get
获得结果,因为我在 Cloud Shell 中进行测试,我使用应用程序默认凭据进行身份验证。您可以按照此document 在本地计算机上对其进行测试。
请问您是否在本地运行 sn-p?如果是这样,这是另一个 SO link,它说明您需要设置 .runtimeconfig
。
我现在知道为什么它对你有用,因为你试图从函数内部访问它,尝试从你的函数外部访问它(例如在第 2 行)
检查我的答案,看看我的问题是什么。感谢您的帮助。【参考方案2】:
我的回答来自 firebase/firebase-tools 回购团队,this issue。
鉴于 403 响应,这似乎是权限问题。您能否给您的服务帐户角色/firebase.developAdmin 角色,然后看看它是否可以工作?
这确实是个问题。一旦我将该角色roles/firebase.developAdmin
添加到我正在部署的服务帐户中,我就成功部署了!
【讨论】:
以上是关于Firebase 函数使用 GOOGLE_APPLICATION_CREDENTIALS 部署未能在全局范围内获取环境配置的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 云函数对另一个 Firebase 云函数的 http 请求
Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native