首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firebase函数版本化

Firebase函数版本化
EN

Stack Overflow用户
提问于 2018-12-05 11:49:16
回答 3查看 1.3K关注 0票数 1

我正在使用Firebase函数,并试图对我的api进行版本化。我正在使用快递作为所有的教程建议。然而,使用此解决方案,我们使用Firebase托管而不是云函数。

托管: https://xxxx.firebaseapp.com

云函数: https://xxxx.cloudfunctions.net

最接近我正在寻找的解决方案是

。

代码语言:javascript
复制
const app1 = express();
app1.use(cors({ origin: true }));
app1.get("*", (request, response) => {
  if(request.url.includes("/v1/")){
    response.send("V1: "+request.path);
  }
  else{
    response.send("V2: "+request.path);
  }

});

const stats = functions.https.onRequest(app1);

module.exports = {
  stats
};

但是,在Firebase函数中只能看到一个函数:



代码语言:javascript
复制
https://xxxx.cloudfunctions.net/stats

此外,您只能处理一种HTTP请求(GET、POST等)。

我正在寻找的是在Firebase函数中拥有:



代码语言:javascript
复制
https://xxxx.cloudfunctions.net/stats/v1/  (including GET, POST, PUT or in another case separate functions with “/:userId” “/save”, etc)
https://xxxx.cloudfunctions.net/stats/v2/  
https://xxxx.cloudfunctions.net/item/v1/

可以用云函数来完成吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-10 13:04:34

最后,我用这样的方式解决了这个问题:

代码语言:javascript
复制
const express = require("express")

const getUserFunctions = express();
getUserFunctions.get("/stats", (request, response) => {
  ...
  ...

});

const v1 = functions.https.onRequest(getUserFunctions);

module.exports = {
  v1,
  v2
};

端点应该是这样的:

代码语言:javascript
复制
https://xxxx.cloudfunctions.net/v1/stats
票数 2
EN

Stack Overflow用户

发布于 2018-12-05 17:42:52

每个路径都可以指向一个不同的函数(或Express应用程序)。在您的firebase.json文件中配置如下所示。你根本不需要一个单独的域名。下面的firebase.json结果是

https://example.com is handled by firebase hosting https://example.com/v1 is handled by firebase function https://example.com/v2 is handled by firebase function https://example.com/v3 is handled by firebase function

代码语言:javascript
复制
{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "hosting": {
    "public": "public",
    "cleanUrls": true,
    "trailingSlash": false,
    "rewrites": [
      {
        "source": "/v1",
        "function": "v1"
      },
      {
        "source": "/v2",
        "function": "v2"
      },
      {
        "source": "/v3",
        "function": "v3"
      }
    ],
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  },
  "storage": {
    "rules": "storage.rules"
  },
  "functions": {
    "source": "functions"
  }
}
票数 2
EN

Stack Overflow用户

发布于 2018-12-05 16:29:39

预计您只会看到一个函数,它的名称是从index.js导出的。所有URL必须通过这个函数锚定。看起来,您希望/stats/*和/items/*都将通过您的函数进行路由,但这不是它的工作方式。

如果您想要不同的路径前缀,您要么需要不同的函数来处理它们,要么您需要为它们设置一个单一的公共前缀。例如,您可以导出一个名为"api“的函数,然后使用它处理所有不同类型的查询:

代码语言:javascript
复制
/api/stats/...
/api/items/...

您还可以考虑对每个不同版本的api使用不同的函数(Express应用程序),让Firebase将不同版本的应用程序路由到不同的应用程序,而不是让一个应用程序在运行时检查版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53631628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档