17
votes

I'm working with firebase functions and arrived to hundreds of functions, and now it is very hard to manage it in single index.js file as shown in their lots of examples

I tried to split that functions in multiple files like:

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

In this structure i divide my functions in three categories and put in that three files groupFunctions.js, authFunctions.js, and storageFunctions.js. I then tried to import thise files in index.js, but I don't know why it is not working for me.

Here is 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...
            //...
        })
}

Here is index.js file:

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

My editor not giving any warning in this code. But when I deploy this code with firebase deploy --only functions, it does not deploy function. If some functions already exist on firebase console, it remove all functions on deploy.

here is deployment logs: enter image description here

question is also asked on github

4

4 Answers

18
votes

Working code example:

file structure:

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

index.js file:

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

groupFunctions.js file:

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...
            //...
        })
}

UPDATE: now I have better solution

The full working code is located at https://github.com/malikasinger1/firebase-functions-with-typescript and it's written with cutting edge tech like typescript and webpack. You may use this as a boilerplate/starter.

5
votes

You can pass the exports object to the function in groupFunctions.js, like this:

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...
            //...
        })
}

Now, in index.js:

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

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

The way it works is that modules.exports is a regular JavaScript object, so you can add new properties to that from wherever you want.

0
votes

If you want support for multiple functions inside a file, this Gist show a real example of how to do it

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

You can dynamically import functions for every *.function.js

0
votes
//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..