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 预定函数?

使用 monorepo 部署到 Firebase 函数

Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native

如何在 Firebase 函数中使用 --fix 修复 Lint 问题

使用 Python 的 Firebase 云函数?