如何构建 Firebase 的云功能以从多个文件部署多个功能?

我想为Firebase创建多个云功能,并从一个项目同时部署它们。我还想将每个函数分离到一个单独的文件中。目前,如果将它们都放在索引中,我可以创建多个函数.js例如:

exports.foo = functions.database.ref('/foo').onWrite(event => {
    ...
});

exports.bar = functions.database.ref('/bar').onWrite(event => {
    ...
});

但是,我想将 foo 和 bar 放在单独的文件中。我试过这个:

/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json

其中 foo.js 是

exports.foo = functions.database.ref('/foo').onWrite(event => {
    ...
});

和酒吧.js是

exports.bar = functions.database.ref('/bar').onWrite(event => {
    ...
});

有没有办法在不将所有函数都放在索引.js的情况下实现这一点?


答案 1

啊,Firebase的云功能正常加载节点模块,所以这有效

结构:

/functions
|--index.js
|--foo.js
|--bar.js
|--package.json

索引.js:

const functions = require('firebase-functions');
const fooModule = require('./foo');
const barModule = require('./bar');

exports.foo = functions.database.ref('/foo').onWrite(fooModule.handler);
exports.bar = functions.database.ref('/bar').onWrite(barModule.handler);

foo.js:

exports.handler = (event) => {
    ...
};

酒吧.js:

exports.handler = (event) => {
    ...
};

答案 2

@jasonsirota的答案非常有帮助。但是,查看更详细的代码可能很有用,尤其是在 HTTP 触发函数的情况下。

使用与@jasonsirota的答案相同的结构,假设您希望在两个不同的文件中具有两个单独的HTTP触发器函数:

目录结构:

    /functions
       |--index.js
       |--foo.js
       |--bar.js
       |--package.json

索引.js:

'use strict';
const fooFunction = require('./foo');
const barFunction = require('./bar');

// Note do below initialization tasks in index.js and
// NOT in child functions:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase); 
const database = admin.database();

// Pass database to child functions so they have access to it
exports.fooFunction = functions.https.onRequest((req, res) => {
    fooFunction.handler(req, res, database);
});
exports.barFunction = functions.https.onRequest((req, res) => {
    barFunction.handler(req, res, database);
});

foo.js:

 exports.handler = function(req, res, database) {
      // Use database to declare databaseRefs:
      usersRef = database.ref('users');
          ...
      res.send('foo ran successfully'); 
   }

酒吧.js:

exports.handler = function(req, res, database) {
  // Use database to declare databaseRefs:
  usersRef = database.ref('users');
      ...
  res.send('bar ran successfully'); 
}