Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在firebase托管的Web应用程序中获取firebase函数URL?_Firebase_Google Cloud Functions_Firebase Hosting - Fatal编程技术网

如何在firebase托管的Web应用程序中获取firebase函数URL?

如何在firebase托管的Web应用程序中获取firebase函数URL?,firebase,google-cloud-functions,firebase-hosting,Firebase,Google Cloud Functions,Firebase Hosting,我正在从事一个项目,在这个项目中,我们已经使用了Firebase的现有云功能。我们正在使用firebase云主机添加一个小型的React SPA,该SPA将与一些现有的公共云功能交互 到目前为止,我们的工作方式是,在Firebase中有一个开发项目和一个生产项目。对于云功能,这很好,我们使用firebase functions:config:set设置了特定于环境的配置,以区分prod和dev服务器 问题来自于托管SPA与云功能的联系。我已经看到了很多关于如何在托管代码中访问环境配置的问题,例如

我正在从事一个项目,在这个项目中,我们已经使用了Firebase的现有云功能。我们正在使用firebase云主机添加一个小型的React SPA,该SPA将与一些现有的公共云功能交互

到目前为止,我们的工作方式是,在Firebase中有一个开发项目和一个生产项目。对于云功能,这很好,我们使用
firebase functions:config:set
设置了特定于环境的配置,以区分prod和dev服务器

问题来自于托管SPA与云功能的联系。我已经看到了很多关于如何在托管代码中访问环境配置的问题,例如:答案似乎是有firebase函数返回环境变量的值,但对我来说,这只是将问题进一步向后推了一步。我完全理解,当SPA在浏览器中运行时,让环境变量访问此代码将是一个巨大的安全问题

托管SPA真正需要的唯一特定于环境的配置是云函数的基址

如果在我的云计算功能中

const functions = require('firebase-functions');
const express = require('express');
const test = express();
test.on('/hello/:target', (req, res) => {
  res.send(`Hello ${req.params.target}`);
})
exports.test = functions.https.onRequest(test);
部署后,此云功能在和都可用。如何最好地为SPA部署到的项目获取适当的根url(或)

例如,在前端js代码中是否有一些我可以访问的全局代码,例如:

const url = `${__FIREBASE_GLOBALS__.cloudFunctions.baseUrl}/test/hello/${input}`;

是否根据托管应用部署到哪个项目来正确定义url?

我在这里假设您在SPA中除了调用云功能之外,没有以任何其他方式使用Firebase(因为您没有说过其他方式)

请阅读,尤其是关于的部分。当您使用Firebase托管网站时,会有一些特殊的URL为您提供该项目的配置。有一些特殊的脚本包含,使您能够访问Firebase产品。特别要注意的是,相对路径URI
/\uu\u/firebase/init.js
将生成使用项目默认设置初始化firebase JavaScript SDK的JavaScript。继续,在指向web应用的浏览器中访问它。您可能对配置的
projectId
属性感兴趣

如果希望获得该值,可以使用Firebase SDK,该SDK将由上面第一个链接中的脚本includes初始化。至少,您可以添加:

<script src="/__/firebase/5.8.2/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>
获取Firebase主机为内容提供服务的项目的ID。您可以使用它来构建函数的URL


您还可以方便地将HTTP函数移植到web站点,并使用Firebase SDK从web站点调用它们以调用kthem。或者没有。

我能够从环境变量中获取区域和appId

例如:

console.log(process.env);
检查firebase日志

{ ...
  ENTRY_POINT: 'server',
  X_GOOGLE_FUNCTION_TRIGGER_TYPE: 'HTTP_TRIGGER',
  FIREBASE_CONFIG: '{"projectId":"pid","databaseURL":"https://pid.firebaseio.com","storageBucket":"pid.appspot.com","locationId":"europe-west"}',
  X_GOOGLE_FUNCTION_NAME: 'server',
  FUNCTION_TRIGGER_TYPE: 'HTTP_TRIGGER',
  X_GOOGLE_GCLOUD_PROJECT: 'pid',
  FUNCTION_NAME: 'server',
  X_GOOGLE_GCP_PROJECT: 'pid',
  X_GOOGLE_FUNCTION_REGION: 'us-central1',
  FUNCTION_REGION: 'us-central1',
  X_GOOGLE_ENTRY_POINT: 'server',
  GCLOUD_PROJECT: 'pid',
  GCP_PROJECT: 'pid',
  ... ommited
}
其中,
GCP\u项目
GCLOUD\u项目
功能区域
功能名称
应能发挥作用。因此对于例如
process.env.FUNCTION\u区域


不确定这会有多可靠。

谢谢道格,我们在SPA中不使用任何其他firebase功能,你说得对。因此,当我添加这些脚本时,我确实可以从配置的firebase应用程序的options属性中获取projectId,但据我所知,这只是URL的一部分,另一部分是某种服务器位置/区域标识符(
us-central1
,在我最初的问题中)。这似乎不包括在选项对象中,您知道我将从哪里获取它吗?是的,您必须知道它是什么,即使您使用可调用的。没办法。哦,这看起来很奇怪,所以没有好办法允许托管应用程序不知道它的项目配置?在同一个项目中,在托管应用程序中获取云函数URL肯定是一个简单解决方案的常见需求。云函数与托管没有任何关系,除了URL重写,其中函数必须绝对部署到us-central1。
firebase.app().options
返回
null
未定义
{ ...
  ENTRY_POINT: 'server',
  X_GOOGLE_FUNCTION_TRIGGER_TYPE: 'HTTP_TRIGGER',
  FIREBASE_CONFIG: '{"projectId":"pid","databaseURL":"https://pid.firebaseio.com","storageBucket":"pid.appspot.com","locationId":"europe-west"}',
  X_GOOGLE_FUNCTION_NAME: 'server',
  FUNCTION_TRIGGER_TYPE: 'HTTP_TRIGGER',
  X_GOOGLE_GCLOUD_PROJECT: 'pid',
  FUNCTION_NAME: 'server',
  X_GOOGLE_GCP_PROJECT: 'pid',
  X_GOOGLE_FUNCTION_REGION: 'us-central1',
  FUNCTION_REGION: 'us-central1',
  X_GOOGLE_ENTRY_POINT: 'server',
  GCLOUD_PROJECT: 'pid',
  GCP_PROJECT: 'pid',
  ... ommited
}