使用Express for Firebase Cloud功能有many examples

在我发现的每个示例中,代码都将Express应用程序公开为单个Cloud Function:

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

对于一个人的Firebase项目功能,这意味着他们将看到一个名为“app”的条目,并且所有Express.js HTTP监听器的所有日志都将转到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控制台中,我有hello函数,并且在index.js中还有另一个函数:

node.js - 声明单独的Firebase Cloud Functions并仍使用Express.js-LMLPHP

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

我将在Firebase控制台中为每个功能获得单独的日志记录。

我想使用中间件来确保将有效的身份验证 token 传递给像Firebase example这样的终结点云函数,但是我不希望不使用单个“应用程序”单个云函数,而希望在我的函数导出中使用专用函数index.js。

最佳答案

感谢Doug Stevenson的回答和帮助。我想提供自己的答案。

因此,通常来说,我的问题的答案是:不,你不能。

正如Doug所指出的那样,对于许多人的扩展需求而言,这不是问题。 Firebase最多可以创建1,000个函数实例以进行扩展。

我想提供与Doug稍有不同的答案,说明我将如何编写Express应用并为项目提供不同的Firebase Cloud Functions:

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路由,例如:
  • /付款/someaction(RPC)
  • /订单(获取,放置,发布等)

  • 另一个好处是,我可以为信用卡付款/处理之类的事情提供“测试” 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]
    

    这使我拥有了一个开发环境和一个实时环境。在我的应用程序配置文件中,我只有一个不同的API网址:
    /us-central1/apptest
    

    或者
    /us-central1/app
    

    关于node.js - 声明单独的Firebase Cloud Functions并仍使用Express.js,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54508523/

    10-16 13:09