Firebase 函数在本地提供时未返回预期的环境配置

Posted

技术标签:

【中文标题】Firebase 函数在本地提供时未返回预期的环境配置【英文标题】:Firebase Function not returning expected environment configuration when served locally 【发布时间】:2018-08-14 16:35:31 【问题描述】:

我有一个托管在 Firebase 托管上的 React 应用程序,它通过调用 Firebase 函数 (an impl recommended here) 来检索环境配置值。下面是函数的实现:

const functions = require('firebase-functions');

module.exports = functions.https.onRequest((req, res) => 
    res.status(200).send(functions.config());
);

当我调用 Firebase CLI 时:

firebase functions:config:get

我明白了:


  "auth": 
        "clientid": MY_CLIENT_ID,
        "signoutreturnto": SOME_URL,
        "responsetype": SOME_URL,
        "redirecturi": SOME_OTHER_URL,
        "scope": SOME_OTHER_STRING,
        "domain": SOME_DOMAIN
    

从 Firebase CLI 调用“Firebase deploy --only functions”会生成一个 URL 端点来调用已部署的 firebase 函数 config,它会返回我的环境配置:

https://us-central1-MY_FIREBASE_APP.cloudfunctions.net/config

调用此端点返回代表我的配置的预期 JSON + 由 Firebase 附加:


    "auth": 
        "clientid": MY_CLIENT_ID,
        "signoutreturnto": SOME_URL,
        "responsetype": SOME_URL,
        "redirecturi": SOME_OTHER_URL,
        "scope": SOME_OTHER_STRING,
        "domain": SOME_DOMAIN
    ,
    "firebase": 
        "databaseURL": MY_DATABASE_URL,
        "storageBucket": MY_STORAGE_BUCKET,
        "apiKey": MY_API_KEY,
        "authDomain": MY_AUTH_DOMAIN,
        "projectId": MY_PROJECT_ID,
        "credential": 
            "credential_": 
        
    

我有edited my firebase.json with re-write rules to serve my functions as API endpoints


  "hosting": 
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      
        "source": "**",
        "destination": "/index.html"
      ,
        
        "source": "/config", "function": "config"
      
    ]
  

但是 - 当我使用 Firebase CLI 中的以下命令在本地提供函数时:

Firebase serve --only functions,hosting

然后我为我的配置函数调用生成的本地端点:

http://localhost:5001/MY_FIREBASE_APP/us-central1/config

返回的 json 对象缺少预期的“auth”对象(见上文)。相反,返回的 JSON 是:


    "firebase": 
        "databaseURL": MY_DATABASE_URL,
        "storageBucket": MY_STORAGE_BUCKET,
        "apiKey": MY_API_KEY,
        "authDomain": MY_AUTH_DOMAIN,
        "projectId": MY_PROJECT_ID,
        "credential": 
            "credential_": 
                  ...
                
            
        
    

这会在本地执行时破坏我的应用程序,因为无法检索到预期的配置值。

为什么我配置的“auth”对象没有像我调用另一个 url 端点时那样包含在结果中?

【问题讨论】:

【参考方案1】:

如果您想在本地模拟函数中使用配置参数,follow the instructions here。具体来说:

如果您使用自定义函数配置变量,请先运行命令以获取自定义配置(在函数目录中运行此命令),然后运行 ​​shell:

cd functions
firebase functions:config:get > .runtimeconfig.json

functions 目录中的 .runtimeconfig.json 文件需要包含要在模拟期间使用的配置。

【讨论】:

谢谢你的链接,道格。我在 SO 中为按照说明遇到的错误创建了另一个问题:***.com/questions/49139823/… @Doug Stevenson - 只是提醒一下,但文档“隐藏”了 shell 说明下的自定义配置/环境说明。就目前而言,如果您使用的是serve --only functions 方法,很容易被忽视。 @MandisaW 您可以随时使用任何页面右上角的“发送反馈”按钮将您的反馈直接发送给文档作者。 @DougStevenson 完成了 - 我想我也忽略了这一点,哈哈

以上是关于Firebase 函数在本地提供时未返回预期的环境配置的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:使用预留托管 URL 时未创建 Firebase 应用“[DEFAULT]”

Firebase 云函数错误:函数返回未定义、预期的 Promise 或值

Firebase 云函数 - 返回未定义、预期的 Promise 或值

if 语句在从 firebase 检索数据时未返回正确的元素

函数返回未定义、预期的 Promise 或值 Firebase 日志错误

函数返回未定义,预期Promise或值和通知长时间延迟