使用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中还有另一个函数:
这也意味着Firebase将为每个函数创建不同的 Node/实例:
hello
和emphemeralKey
。我将在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路由,例如:
另一个好处是,我可以为信用卡付款/处理之类的事情提供“测试” 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/