如何在Firebase托管中配置重写规则以将某些请求路由到云函数?



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

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

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

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

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

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

为所有资源(托管、函数和数据库)维护一个项目是理想的选择,我认为这是管理 Firebase 项目的正确方法。

您尝试仅更改托管服务的一个参数(重写),这不是它的工作方式。当您部署 firebase.json 时,所有其他配置都会被覆盖。因此,您收到的错误是因为Firebase没有查看最后一个配置文件并检查要更新的不同之处,它只是尝试覆盖所有最后一个配置文件并收到错误,因为"public"是托管的必需参数。

也就是说,现在您期望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访问验证功能。

这个问题已经在这里得到了回答 Firebase 托管与动态云功能重写

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

我已经投票支持马科斯五世的答案,但我真的不能接受这个答案。主要是因为在微服务世界中,您不会在一个地方创建具有所有功能的单体架构。您宁愿分解为可管理的块,并根据应用程序的必要/合理程度创建尽可能多的适当微服务。

使用当前使用 firebase 托管的设置,您必须将主机配置文件单独放在一个项目中。此外,托管应该在一个项目中,因为与您的网站相关的所有 HTML、JS、CSS 都将具有相互依赖关系,因此是不可分割的(至少到目前为止)。

而云功能最好被视为服务于明确目的的微服务,因此需要根据需要在单独的项目/微服务中。可以使用firebase deploy --only functions:YOUR_FN_NAME轻松部署

每当需要为新的云函数微服务添加映射时,请继续在主托管应用程序中进行路由更改并部署相同的映射。通过这种方法,我们至少可以让后端部分成为微服务。

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

最新更新