无法在多个文件中拆分 Firebase 函数

Posted

技术标签:

【中文标题】无法在多个文件中拆分 Firebase 函数【英文标题】:unable to split Firebase functions in multiple files 【发布时间】:2017-11-09 23:18:56 【问题描述】:

我正在使用 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 控制台上已经存在某些功能,它会在部署时删除所有功能。

这是部署日志:

问题也在github提问

【问题讨论】:

【参考方案1】:

工作代码示例:

文件结构:

--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,它是使用打字稿和 webpack 等尖端技术编写的。您可以将其用作样板/启动器。

【讨论】:

迄今为止我见过的最佳方法。使组织我的功能变得容易。拥有一头大象 index.js 开始让我发疯。 admin.initializeApp(functions.config().firebase); 应该在哪里?因为当多次调用initializeApp() 时,firebase 会返回错误... @andrewsee 我已经更新了答案,可能对你更有帮助 @andrei-lupsa 看看我的新方法,可能会帮助你更多地组织你的代码 你太棒了!【参考方案2】:
//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]
     
  )
 )

Folders like so.. will work

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

【讨论】:

【参考方案3】:

如果你想在一个文件中支持多个函数,这个 Gist 展示了一个真实的例子来说明如何做到这一点

https://gist.github.com/saintplay/3f965e0aea933a1129cc2c9a823e74d7#file-index-js

您可以为每个*.function.js动态导入函数

【讨论】:

【参考方案4】:

您可以将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 文件 我只想在 inde.js 中进行导入,然后在其他文件中完成所有工作 删除 () 也不能解决我的问题 GCF 的工作方式是读取 index.js,查看其导出,并将每个导出部署为函数。你能确认 index.js 的 module.exports 包含命名函数吗? 我用另一个想法更新了回复。让我知道它是否有效,以便我更新响应。

以上是关于无法在多个文件中拆分 Firebase 函数的主要内容,如果未能解决你的问题,请参考以下文章

React Redux Firebase 无法获取 firebase.storage

无法构建模块 Firebase

Flutter Firebase 存储期货问题

将多个图像存储到 Firebase 并获取 url

Swift 2.3 pod 更新后使用未解析的标识符 Firebase 'FIR'

颤动的firebase身份验证提供者未通知