簡體   English   中英

Firebase Cloud Functions版本控制

[英]Firebase Cloud Functions versioning

我正在使用Firebase Cloud Functions,並且正在嘗試對api進行版本控制。 我正在按照所有教程的建議使用Express。 但是,通過此解決方案,我們使用Firebase Hosting代替Cloud Functions。

托管: https //xxxx.firebaseapp.com

雲功能: https : //xxxx.cloudfunctions.net

最接近我正在尋找的解決方案是這個

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可以做到嗎?

預計您只會看到一個具有從index.js導出的名稱的函數。 所有URL必須通過該功能錨定。 您似乎希望/ stats / *和/ items / *都可以路由您的函數,但這並不是它的工作方式。

如果要使用不同的路徑前綴,則可能需要使用不同的函數來處理它們,或者都需要為它們使用單​​個公共前綴。 例如,您可以導出一個名為“ api”的函數,然后使用它來處理所有不同類型的查詢:

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

您可能還需要考慮為API的每個不同版本使用不同的功能(Express應用程序),並讓Firebase Hosting將不同版本路由到其他應用程序,而不是讓單個應用程序在運行時檢查版本。

每個路徑可以指向不同的功能(或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"
  }
}

最后,我以這種方式解決了它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM