Управление версиями облачных функций Firebase - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю с Firebase Cloud Functions и пытаюсь создать версию моего API.Я использую экспресс, поскольку все учебники предлагают .Однако в этом решении мы используем Firebase Hosting вместо облачных функций.

Хостинг: 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:

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/

Возможно ли это сделать с помощью облачных функций?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Каждый путь может указывать на отдельную функцию (или приложение 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"
  }
}
0 голосов
/ 10 августа 2019

Наконец, я решил это следующим образом:

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
0 голосов
/ 05 декабря 2018

Ожидается, что вы увидите только одну функцию с именем, которое вы экспортировали из вашего index.js.Все URL должны быть привязаны с помощью одной этой функции.Похоже, вы ожидаете, что и / stats / *, и / items / * будут проходить через вашу функцию, но это не так, как она работает.

Если вы хотите использовать разные префиксы пути, вам понадобятся разныефункции для их обработки, или вам нужно будет иметь один общий префикс для них всех.Например, вы можете экспортировать функцию с именем «api», а затем использовать ее для обработки всех типов запросов:

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

Вы также можете рассмотреть возможность использования различных функций (приложений Express) для каждого отдельного приложения.версия вашего API, и Firebase Hosting направляет различные версии к другому приложению, вместо того, чтобы одно приложение проверяло версию во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...