web-dev-qa-db-ja.com

Firebase関数を複数のファイルに分割できません

私はfirebase関数を使用していて、何百もの関数に到達しましたが、多くの例に示されているように、単一のindex.jsファイルで管理するのは非常に困難です。

私はその関数を次のような複数のファイルに分割しようとしました:

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

この構造では、関数を3つのカテゴリに分割し、その3つのファイルgroupFunctions.jsauthFunctions.js、およびstorageFunctions.jsに入れます。次に、thiseファイルを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コンソールにすでに存在する場合、デプロイ時にすべての関数が削除されます。

ここに展開ログがあります: enter image description here

質問も github

16
Inzamam Malik

実用的なコード例:

ファイル構造:

--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 にあり、TypeScriptやwebpackなどの最先端の技術で書かれています。これをボイラープレート/スターターとして使用できます。

15
Inzamam Malik

次のように、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オブジェクトであるため、どこからでも新しいプロパティを追加できます。

5
mhaligowski

ファイル内の複数の関数のサポートが必要な場合、この要点はそれを行う方法の実際の例を示しています

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

*.function.jsごとに関数を動的にインポートできます

0
Saint Play
//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]
     }
  })
 })

そのようなフォルダは機能します

 //Example Home.functions.js :
 exports.Home = functions.https..
0
Gerard Tolan