无法将Firebase函数拆分为多个文件

18

我正在使用 Firebase 函数,涉及数百个函数,现在在单个 index.js 文件中管理它变得非常困难,就像他们的许多示例中所展示的那样。

我尝试将这些函数拆分到多个文件中,例如:

--firebase.json
--functions
  --node_modules
  --index.js
  --package.json
  --app
    --groupFunctions.js
    --authFunctions.js
    --storageFunctions.js
在这个结构中,我将我的函数分为三类,并将它们放在三个文件中:groupFunctions.jsauthFunctions.jsstorageFunctions.js。然后我试图在index.js中导入这些文件,但我不知道为什么它对我不起作用。
这是groupFunctions.js
var functions = require('firebase-functions');
module.exports = function(){
    exports.onGroupCreate = functions.database.ref('/groups/{groupId}')
        .onWrite(event => {
            console.log(`A group is created in database named:${event.params.groupId}.`);
            // some logic...
            //...
        })
}

这里是index.js文件:

var functions = require('firebase-functions');
module.exports = require("./app/groupFunctions")();

我的编辑器在这段代码中没有给出任何警告。但是,当我使用 firebase deploy --only functions 部署此代码时,它不会部署函数。如果一些函数已经存在于 firebase 控制台上,则在部署时它会删除所有函数。

以下是部署日志: enter image description here

问题也在 GitHub 上提出。

4个回答

17

工作代码示例:

文件结构:

--firebase.json
--functions
  --node_modules
  --index.js
  --package.json
  --src
    --groupFunctions.js
    --authFunctions.js
    --storageFunctions.js

index.js 文件:

require('./src/groupFunctions.js')(exports);
require('./src/authFunctions.js')(exports);
require('./src/storageFunctions.js')(exports);

groupFunctions.js文件:

var functions = require('firebase-functions');

module.exports = function (e) {
    e.onGroupCreate = functions.database.ref('/groups/{groupId}')
        .onWrite(event => {
            console.log(`A group is created in database named:${event.params.groupId}.`);
            // some logic...
            //...
        })
}

更新:现在我有更好的解决方案

完整的可工作代码位于 https://github.com/malikasinger1/firebase-functions-with-typescript,使用了像typescript和webpack这样的前沿技术。你可以将其用作模板/起始点。


到目前为止,这是我见过的最好的方法。它使得组织我的函数变得容易。拥有一个名为index.js的庞然大物开始让我发疯了。 - user2154462
4
admin.initializeApp(functions.config().firebase); 应该放在哪里?因为当调用 initializeApp() 超过一次时,Firebase会返回错误... - Andrew See
@andrewsee 我已经更新了答案,可能对你更有帮助。 - Inzamam Malik
@andrei-lupsa 看看我的新方法,可能更有助于你组织代码。 - Inzamam Malik
你有没有不带 TypeScript 的相同代码? - Stephane Paquet
我的答案中包含的代码是纯JavaScript(没有TypeScript),TypeScript的代码在我的git存储库中,我只是在答案中提到了该存储库的链接,因为你们中的一些人可能会发现它有用。 - Inzamam Malik

5
您可以将exports对象传递给groupFunctions.js函数,就像这样:
var functions = require('firebase-functions');

module.exports = function (e) {
    e.onGroupCreate = functions.database.ref('/groups/{groupId}')
        .onWrite(event => {
            console.log(`A group is created in database named:${event.params.groupId}.`);
            // some logic...
            //...
        })
}

现在,在index.js中:
var functions = require('firebase-functions');

require("./app/groupFunctions")(module.exports);

它的工作原理是modules.exports是一个普通的JavaScript对象,所以你可以从任何地方向其中添加新属性。


首先,我希望它永远不要更改 index.js 文件。 - Inzamam Malik
我只想在index.js中进行导入,然后在其他文件中完成所有工作。 - Inzamam Malik
去掉括号也不能解决我的问题。 - Inzamam Malik
GCF的工作方式是读取index.js,查看其导出内容,并将每个导出项部署为函数。您能否确认index.js的module.exports包含命名函数? - mhaligowski
我用另一个想法更新了响应。请告诉我它是否有效,这样我就可以更新响应。 - mhaligowski
显示剩余3条评论

1
//index.js
const glob = require('glob')
const files = glob.sync('./**/*.functions.js', { cwd: __dirname, 
ignore: './node_modules/**' })

files.forEach(file => {
const functionModule = require(file)
const functionNames = Object.keys(functionModule)

functionNames.forEach(functionName => {
    if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 
    functionName) {
         exports[functionName] = functionModule[functionName]
     }
  })
 })

像这样的文件夹..将会起作用

 //Example Home.functions.js :
 exports.Home = functions.https..

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接