如何在firebase-hosting中配置重写规则以将某些请求路由到云功能?

时间:2017-06-09 15:03:50

标签: firebase google-cloud-functions firebase-hosting

我使用聚合物2.0和聚合物火力建造的PWA,是我的网络应用程序。我有一个快速应用程序充当云功能(微服务)。 示例:exports.register=functions.https.onRequest(app);

如何添加重写规则以将/fns/register/fns/verify映射到上述应用register

我已经在云功能微服务项目中更新了我的firebase.json文件,但是当我运行firebase deploy --only functions:register时,它说没有用于部署托管配置的公共文件夹!

{
    "hosting": {
        "rewrites": [{
            "source": "/fns/**", "function": "register"
        }]
    }    
}

在原始Web应用程序中维护重写规则可能是一种选择,但仍然不是理想的恕我直言。如果我要在原始的Web应用程序中执行此操作,我也尝试过,但无法实现。以下是我在原始网络应用中更新的firebase.json

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "build/default/public",
    "rewrites": [
      {
        "source": "/fns/**",
        "function": "register"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

3 个答案:

答案 0 :(得分:25)

维护所有资源(主机,功能和数据库)只需一个项目是理想的,我认为这是管理Firebase项目的正确方法。

您正尝试更改托管服务的一个参数(重写),而不是它的工作方式。部署firebase.json时,将覆盖所有其他配置。所以,你得到的错误是因为Firebase没有查看最后一个配置文件并检查更新有什么不同,它只是试图覆盖所有最后的配置文件并得到一个错误,因为“public”是托管所必需的参数。 / p>

这解释了,现在您希望Firebase将/fns/register重写为/register,但它不会发生。您的函数将收到“完整”网址/fns/register

我认为,最好的方法是创建根路由:

var functions = require('firebase-functions');
var express = require('express');

var app = express();
var router = express.Router();

router.post('/register', registerFunction);
router.post('/verify', verifyFunction);

app.use('/fns', router);

exports.fns = functions.https.onRequest(app);

并将所有函数重写为fns函数:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "build/default/public",
    "rewrites": [
      {
        "source": "/fns/**",
        "function": "fns"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

现在,您可以使用https://<your-project-id>.firebaseapp.com/fns/register来覆盖您的注册功能,并使用https://<your-project-id>.firebaseapp.com/fns/verify来验证您的验证功能。

答案 1 :(得分:0)

此问题已在Firebase Hosting with dynamic cloud functions rewrites

中得到解答

我同意你的看法,最好将SPA保留在一个项目中,将微服务保留在另一个项目中,但@Marcos V正确使用根函数

答案 2 :(得分:-2)

我已经投了Marcos V.的回答,但我不能接受这个答案。主要是因为在微服务世界中,您不会在一个地方创建具有所有功能的巨石。您宁愿分成可管理的块,并为应用程序提供必要/合理的适当微服务。

使用firebase-hosting进行当前设置时,您必须单独在一个项目中拥有主机配置文件。此外,托管应该在一个项目中,因为与您的站点相关的所有HTML,JS,CSS都具有相互依赖性,因此是不可分割的(至少截至目前)。

尽管云功能更好地被视为服务于确定目的的微服务,因此需要根据需要在单独的项目/微服务中。哪个可以使用firebase deploy --only functions:YOUR_FN_NAME

轻松部署

每当您需要为新的云功能微服务添加映射时,请继续在主要宿主应用程序中进行路由更改并进行部署。通过这种方法,我们至少可以将后端部分作为微服务。

现在,在同一个托管应用程序或单独的项目中维护数据库规则,由设计人员根据其用例决定。

相关问题