Объявите отдельные облачные функции Firebase и продолжайте использовать Express.js - PullRequest
0 голосов
/ 04 февраля 2019

Существует множество примеров использования облачных функций Express для Firebase.

В каждом из приведенных мной примеров код представляет приложение Express как одну облачную функцию:

exports.app = functions.https.onRequest(app);

Для своих функций проекта Firebase это означает, что они увидят одну запись, называемую «приложение», и все журналы для всех прослушивателей HTTP Express.js перейдут в одно место в Firebase.Это также означает, что независимо от того, насколько велико приложение Express.js, Firebase развернет в приложении одну производственную функцию.

В качестве альтернативы, при использовании firebase-functions.https.onRequest вы получаете отдельные функции для каждого экспорта, напримерв Typescript:

export const hello = functions.https.onRequest(async (req, res) => {
  res.status(200).send('hello world');
});

А в Firebase Console у меня есть функция hello, а также другая функция в моем index.js:

enter image description here

Это также означает, что Firebase будет создавать разные узлы / экземпляры для каждой функции: hello и emphemeralKey.

И я получу отдельное ведение журнала для каждой функции в консоли Firebase.

Я хотел бы использовать промежуточное программное обеспечение, чтобы гарантировать, что действительные токены авторизации передаются в мои облачные функции конечной точки, например, Пример Firebase , но я бы предпочел не использовать одну единственную облачную функцию "приложения".Я предпочитаю выделенную функцию для экспорта функций в моем index.js.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Спасибо Дагу Стивенсону за его ответ и помощь.Хотя я хотел дать свой собственный ответ.

Так что ответ на мой вопрос, вообще говоря: нет, вы не можете.

Как указывал Даг, это не проблема дляпотребности масштабирования многих людей.Firebase создаст до 1000 экземпляров вашей функции для масштабирования.

Я хотел бы дать немного другой ответ, чем Дуг, на то, как я написал бы приложение Express и имел бы различные функции Firebase Cloud для проекта:

const payment = express()
const order = express()
payment.get('/route', ...)
order.get('/route', ...)
export const payment = functions.https.onRequest(payment)
export const order = functions.https.onRequest(order)

Преимущество здесь в том, что я могу начать выражать маршруты REST или RPC, например:

  • / payment / someaction (RPC)
  • / order (get, put, почта и т. д.)

Другое преимущество заключается в том, что я могу предоставить «тестовый» API и «живой» API для таких вещей, как платежи / обработка по кредитной карте:

// [START Express LIVE App]


// [START get user]
app.get('/user', async (req, res) => {
  await handleGetUser(req, res, paymentServiceLive);
});
// [END get user]

// [START claim]
app.post('/claim', async (req, res) => {
  await handleClaim(req, res, claimEmailTo);
});
// [END claim]

// [START user]
app.post('/user', async (req, res) => {
  await handleUserPost(req, res, paymentServiceLive);
});
// [END user]

// [START ephemeralKey]
app.post('/ephemeralKey', async (req, res) => {
  await handleEphemeralKey(req, res, paymentServiceLive);
});
// [END ephemeralKey]


// [START charge]
app.post('/charge', async (req, res) => {
  await handleCharge(req, res, paymentServiceLive);
});
// [END charge]

// [START purchase]
app.post('/purchase', async (req, res) => {
  await handlePurchase(req, res, paymentServiceLive);
});
// [END purchase]

//Expose Express API as a single Cloud Function:
exports.app = functions.https.onRequest(app);

// [END Express LIVE App]



// [START Express TEST App]

// [START get user]
appTest.get('/user', async (req, res) => {
  console.log('appTest /user get', req);
  await handleGetUser(req, res, paymentServiceTest);
});
// [END get user]

// [START claim]
appTest.post('/claim', async (req, res) => {
  await handleClaim(req, res, claimEmailToTest, true);
});
// [END claim]


// [START user]
appTest.post('/user', async (req, res) => {
  console.log('appTest /user post', req);
  await handleUserPost(req, res, paymentServiceTest);
});
// [END user]

// [START ephemeralKey]
appTest.post('/ephemeralKey', async (req, res) => {
  await handleEphemeralKey(req, res, paymentServiceTest)
});
// [END ephemeralKey]


// [START charge]
appTest.post('/charge', async (req, res) => {
  await handleCharge(req, res, stripeTest);
});
// [END charge]

// [START purchase]
appTest.post('/purchase', async (req, res) => {
  await handlePurchase(req, res, paymentServiceTest);
});
// [END purchase]

//Expose Express API as a single Cloud Function:np
exports.apptest = functions.https.onRequest(appTest);

// [END Express TEST App]

Это позволяет мне иметь среду разработки и живую среду.в файлах конфигурации моего приложения у меня просто другой URL-адрес API:

/us-central1/apptest

или

/us-central1/app
0 голосов
/ 11 августа 2019

Интересное обсуждение.

Я выбираю тот же подход: одна "конечная точка" (так называемый корневой маршрут, такой как "/ posts", "/ users") == выделенная облачная функция (по уже вызванной причине+ это больше "µservice like" и это то, что для меня "лямбда-функции".

Чтобы быть "СУХИМ", все мои функции импортируют генератор "экспресс".Я настраиваю свой экспресс-экземпляр в одном месте.

const express = () => {
  const express = require("express");
  const cors = require("cors")({ origin: true });
  const morgan = require("morgan");
  const helmet = require("helmet");

  const app = express();

  app.use(helmet());
  app.use(helmet.noCache());
  app.use(cors);
  app.use(morgan("combined"));

  return app;
};

module.exports = express;

Моя конечная точка "привет":

const app = require("./../../express")();

/**
 * /hello
 */

app.get("/", (req, res) => {
  return res.send("Hello World");
});

module.exports = app;

Мой index.js (основной экспорт):

const helloApi = require("./api/hello");

const https = functions.region("europe-west1").https;

module.exports.hello = https.onRequest(helloApi);

Кажется, работает хорошо для нас:)

0 голосов
/ 04 февраля 2019

Если у вас есть одно экспресс-приложение, вы не можете разделить его маршруты между различными логическими функциями в проекте.Если вам нужно попытаться распределить нагрузку между несколькими функциями, вы можете развернуть одно и то же экспресс-приложение на любое количество отдельных функций.

const app = express()
app.get('/route1', ...)
app.get('/route2', ...)
export const f1 = functions.https.onRequest(app)
export const f2 = functions.https.onRequest(app)
// etc

Теперь вы можете попытаться обратиться к этим различным маршрутам междуразные функции (и их разные результирующие URL).Но вы по своей сути не ограничивали использование определенных маршрутов в различных функциях.Вы должны убедиться, что клиенты используют нужную вам функцию.

Если вы пытаетесь выполнить это разделение по соображениям производительности, я бы посчитал это преждевременной оптимизацией.Облачные функции легко масштабируют ваше приложение за пределы одного экземпляра сервера по требованию.Такое разделение ваших функций может помочь масштабируемости, если вы ожидаете превышения задокументированных пределов , но я ожидаю, что это будет необычно.Без понимания фактических, наблюдаемых характеристик производительности вашего приложения невозможно сказать.Если вы превысили пределы , обратитесь в службу поддержки , чтобы объяснить, что происходит не так, как вы ожидаете при развертывании.

Если вы найдете базовое ведение журнала для облачных функцийчтобы быть бесполезным при мониторинге каждого из ваших маршрутов, вам следует изучить настраиваемое ведение журнала StackDriver , которое поможет вам лучше организовывать и отслеживать различные типы журналов, создаваемых вашими функциями.

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