无法在多个文件中拆分 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.js
、authFunctions.js
和storageFunctions.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