【问题标题】:Firebase Cloud Functions versioningFirebase Cloud Functions 版本控制
【发布时间】:2019-05-06 23:35:11
【问题描述】:

我正在使用 Firebase Cloud Functions,并且正在尝试对我的 api 进行版本控制。我使用 express 作为所有教程suggest。但是,在此解决方案中,我们使用 Firebase 托管而不是 Cloud Functions。

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

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

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

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 Cloud Functions 中看到一个函数:

https://xxxx.cloudfunctions.net/stats

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

我正在寻找的是 Firebase Cloud Functions:

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/

是否可以使用 Cloud Functions 来做到这一点?

【问题讨论】:

    标签: javascript firebase express google-cloud-functions


    【解决方案1】:

    每条路径都可以指向不同的功能(或 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

    {
      "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】:

      最后我是这样解决的:

      const express = require("express")
      
      const getUserFunctions = express();
      getUserFunctions.get("/stats", (request, response) => {
        ...
        ...
      
      });
      
      const v1 = functions.https.onRequest(getUserFunctions);
      
      module.exports = {
        v1,
        v2
      };
      

      所以端点应该是这样的:

      https://xxxx.cloudfunctions.net/v1/stats
      

      【讨论】:

        【解决方案3】:

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

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

        /api/stats/...
        /api/items/...
        

        您可能还需要考虑为每个不同版本的 api 使用不同的函数(Express 应用),并让 Firebase 托管将不同版本路由到不同的应用,而不是让单个应用在运行时检查版本。

        【讨论】:

          猜你喜欢
          • 2018-09-02
          • 2020-10-01
          • 2021-06-09
          • 2018-06-11
          • 1970-01-01
          • 2018-09-22
          • 2020-09-17
          • 2020-12-12
          • 2017-09-07
          相关资源
          最近更新 更多