声明单独的 Firebase Cloud Functions 并仍然使用 Express.js [英] Declare separate Firebase Cloud Functions and still use Express.js

查看:24
本文介绍了声明单独的 Firebase Cloud Functions 并仍然使用 Express.js的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这也意味着 Firebase 将为每个函数创建不同的节点/实例:helloemphemeralKey.

我将在 Firebase 控制台中为每个函数单独记录日志.

我想使用中间件来确保将有效的身份验证令牌传递给我的端点 Cloud Functions,如下所示 Firebase 示例 但我不想使用单个应用程序"单个云函数,我更喜欢索引中的函数导出专用函数.js.

解决方案

感谢 Doug Stevenson 的回答和帮助.不过,我想提供我自己的答案.

所以我的问题的答案是,一般来说:不,你不能.

正如 Doug 所指出的,这对于许多人的扩展需求来说不是问题.Firebase 将创建多达 1000 个函数实例以进行扩展.

我想提供一个与 Doug 略有不同的答案,说明我将如何编写 Express 应用程序并为项目使用不同的 Firebase 云函数:

const payment = express()const order = express()payment.get('/route', ...)order.get('/route', ...)出口 const 支付 = 函数.https.onRequest(payment)export const order = functions.https.onRequest(order)

这里的优点是我可以开始表达 REST 或 RPC 路由,例如:

  • /payment/someaction (RPC)
  • /order(获取、放置、发布等)

另一个好处是,我可以为信用卡支付/处理等事情提供测试"API 和实时"API:

//[启动 Express LIVE 应用程序]//[开始获取用户]app.get('/user', async (req, res) => {await handleGetUser(req, res, paymentServiceLive);});//[结束获取用户]//[开始声明]app.post('/claim', async (req, res) => {等待 handleClaim(req, res, claimEmailTo);});//[结束声明]//[启动用户]app.post('/user', async (req, res) => {等待 handleUserPost(req, res, paymentServiceLive);});//[最终用户]//[开始临时密钥]app.post('/ephemeralKey', async (req, res) => {等待 handleEphemeralKey(req, res, paymentServiceLive);});//[END ephemeralKey]//[开始收费]app.post('/charge', async (req, res) => {等待 handleCharge(req, res, paymentServiceLive);});//[结束收费]//[开始购买]app.post('/purchase', async (req, res) => {等待 handlePurchase(req, res, paymentServiceLive);});//[结束购买]//将 Express API 作为单个云函数公开:export.app = functions.https.onRequest(app);//[END Express LIVE App]//[开始快速测试应用程序]//[开始获取用户]appTest.get('/user', async (req, res) => {console.log('appTest/user get', req);等待 handleGetUser(req, res, paymentServiceTest);});//[结束获取用户]//[开始声明]appTest.post('/claim', async (req, res) => {await handleClaim(req, res, claimEmailToTest, true);});//[结束声明]//[启动用户]appTest.post('/user', async (req, res) => {console.log('appTest/user post', req);等待 handleUserPost(req, res, paymentServiceTest);});//[最终用户]//[开始临时密钥]appTest.post('/ephemeralKey', async (req, res) => {await handleEphemeralKey(req, res, paymentServiceTest)});//[END ephemeralKey]//[开始收费]appTest.post('/charge', async (req, res) => {等待 handleCharge(req, res, stripeTest);});//[结束收费]//[开始购买]appTest.post('/purchase', async (req, res) => {等待 handlePurchase(req, res, paymentServiceTest);});//[结束购买]//将 Express API 作为单个 Cloud Functions 公开:npexport.apptest = functions.https.onRequest(appTest);//[END Express TEST 应用程序]

这让我有一个开发环境和一个实时环境.在我的应用程序配置文件中,我只有一个不同的 API 网址:

/us-central1/apptest

/us-central1/app

There are many examples of using Express for Firebase Cloud Functions.

In every example of I have found the code exposes the Express app as a single Cloud Function:

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

For one's Firebase Project Functions that means they will see one entry called "app" and all logs for all Express.js HTTP listeners will go to one place in Firebase. This also means, no matter how large one's Express.js app is, Firebase will deploy a single function in production for the app.

Alternatively, when using firebase-functions.https.onRequest you get separate functions for each export, for example, in Typescript:

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

And in Firebase Console, I have my hello function and also another function in my index.js:

This also means Firebase will create different nodes/instances for each function: hello and emphemeralKey.

And I will get separate logging for each function in the Firebase Console.

I would like to use middleware to ensure that valid auth tokens are being passed to my endpoint Cloud Functions like this Firebase example but I would prefer not to use a single "app" single Cloud Function, I would prefer a dedicated function for function export in my index.js.

解决方案

Thanks to Doug Stevenson for his answer and help. I wanted to provide my own answer though.

So the answer to my question is, generally speaking: no you can't.

As Doug was pointing out, this is not a problem for many people's scaling needs. Firebase will create up to 1,000 instances of your function to scale.

I wanted to provide a slightly different answer then Doug's to how I would write an Express app and have different Firebase Cloud Functions for a project:

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)

The advantage here is that I can start to express REST or RPC routes like:

  • /payment/someaction (RPC)
  • /order (get,put,post, etc.)

Another benefit is that I can provide a "test" API and a "live" API for things like credit card payments/processing:

// [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]

This allows me to have a development environment and a live environment. in my app config files I just have a different API url:

/us-central1/apptest

or

/us-central1/app

这篇关于声明单独的 Firebase Cloud Functions 并仍然使用 Express.js的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆