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

21 浏览
0 Comments

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

我正在使用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(`已在数据库中创建名为${event.params.groupId}的组。`);
            // 一些逻辑...
            //...
        })
}

这是index.js文件的内容:

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

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

这是部署日志:

在这里输入图片描述

问题也在GitHub上提问了。

0
0 Comments

问题出现的原因:无法将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文件的情况下,在其他文件中进行函数的逻辑处理。

希望以上方法可以帮助解决你的问题。如果确实有效,请将其标记为正确答案。

0
0 Comments

问题的原因是无法将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函数的代码。

0
0 Comments

无法将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函数拆分为多个文件的原因和解决方法的整理。

0