无法将Firebase函数拆分为多个文件
无法将Firebase函数拆分为多个文件
我正在使用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(`已在数据库中创建名为${event.params.groupId}的组。`); // 一些逻辑... //... }) }
这是index.js
文件的内容:
var functions = require('firebase-functions'); module.exports = require("./app/groupFunctions")();
我的编辑器在这段代码中没有给出任何警告。但是当我使用firebase deploy --only functions
部署这段代码时,它不会部署函数。如果在Firebase控制台上已经存在一些函数,它会在部署时删除所有函数。
这是部署日志:
问题也在GitHub上提问了。
问题出现的原因:无法将Firebase函数拆分为多个文件的原因是无法在index.js文件中导入其他文件并在其中运行函数逻辑。
解决方法:可以通过在groupFunctions.js文件中将exports对象传递给函数来解决此问题。然后,在index.js文件中导入groupFunctions.js并将module.exports传递给它。
接下来,我将提供一个中文版本的整理文章:
有时候我们希望在Firebase函数中将逻辑分散到不同的文件中,但是发现无法将函数拆分为多个文件。下面是一个解决此问题的方法。
在groupFunctions.js文件中,我们可以将exports对象传递给函数,如下所示:
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文件中引入groupFunctions.js并将module.exports传递给它,如下所示:
var functions = require('firebase-functions'); require("./app/groupFunctions")(module.exports);
这样做的原理是,module.exports是一个常规的JavaScript对象,所以我们可以从任何地方向其中添加新属性。
通过这种方法,我们可以在不改变index.js文件的情况下,在其他文件中进行函数的逻辑处理。
希望以上方法可以帮助解决你的问题。如果确实有效,请将其标记为正确答案。
问题的原因是无法将Firebase函数拆分为多个文件。这是因为在index.js文件中,通过使用glob模块来查找以.functions.js结尾的文件,并将找到的每个文件作为模块引入。然后,通过Object.keys()方法获取每个模块的函数名,并将这些函数名作为exports对象的属性,将函数作为属性值导出。
解决方法是将所有的Firebase函数都放在一个文件中,而不是拆分为多个文件。这样,可以确保所有的函数都能被正确导出和使用。另外,需要在index.js文件中的glob.sync()方法中设置正确的文件路径和忽略的文件夹路径,以确保只找到需要的函数文件。
以下是解决方法的示例代码:
//index.js const glob = require('glob') const files = glob.sync('./**/*.functions.js', { cwd: __dirname, ignore: './node_modules/**' }) const functions = {} 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) { functions[functionName] = functionModule[functionName] } }) }) // 导出所有的Firebase函数 exports = functions
//Example Home.functions.js : exports.Home = functions.https..
通过以上的修改,可以解决无法将Firebase函数拆分为多个文件的问题。现在,每个Firebase函数都可以在各自的文件中定义,并通过导入到index.js文件中进行统一导出和使用。这样可以更好地组织和管理Firebase函数的代码。
无法将Firebase函数拆分为多个文件的原因是在index.js文件中使用了require语句来引入其他文件,但是在groupFunctions.js文件中的代码没有正确导出函数。解决方法是在groupFunctions.js文件中使用module.exports将函数导出。
具体的代码如下:
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文件中使用过多的代码。
在使用initializeApp()函数时要注意,firebase只能调用一次initializeApp()函数,多次调用会导致错误。因此需要确保在合适的位置调用initializeApp()函数。
以上是关于无法将Firebase函数拆分为多个文件的原因和解决方法的整理。