yasutomogのブログ

Software Engineerの雑記

Firestoreを使用するFirebase Cloud Functionsをファイル分割した時のエラー対応

概要

  • Firebase Cloud functionsで、Firestoreを利用している
  • 当初は、index.jsに関数定義していた
  • 複数関数定義する必要があったので、関数ごとにファイル分割した
  • 1回目の関数実行時は特に問題ないが、2回目以降の呼び出し時に以下のエラーが発生 (初期化は1回にしなさいとのこと)
The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most 
cases you only need to call initializeApp() once. But if you do want to initialize multiple apps, pass a second argument to initializeApp() to give each app a unique name.

エラー発生時のコード

  • index.js
const foo = require('./foo')
const bar = require('./bar')
exports.foo = foo.hoge
exports.bar = bar.fuga
  • foo.js
const functions = require('firebase-functions');
const admin = require('firebase-admin')

exports.hoge = functions.region('asia-northeast1').https.onCall(async (data, context) => {

  admin.initializeApp()
  const fireStore = admin.firestore()

  // 以下、firestoreを使った処理

})
  • bar.js
const functions = require('firebase-functions');
const admin = require('firebase-admin')

exports.fuga = functions.region('asia-northeast1').https.onCall(async (data, context) => {

  admin.initializeApp()
  const fireStore = admin.firestore()

  // 以下、firestoreを使った処理

})

エラー解決用に修正したコード

  • index.js(変更なし)
const foo = require('./foo')
const bar = require('./bar')
exports.foo = foo.hoge
exports.bar = bar.fuga
  • firestore.js(新規追加)
const admin = require('firebase-admin');

admin.initializeApp();
const fireStore = admin.firestore();

module.exports = {
  fireStore,
};
  • foo.js(変更)
const functions = require('firebase-functions');
const { fireStore } = require('./firestore')

exports.hoge = functions.region('asia-northeast1').https.onCall(async (data, context) => {

  // 以下、firestoreを使った処理

})
  • bar.js(変更)
const functions = require('firebase-functions');
const { fireStore } = require('./firestore')

exports.fuga = functions.region('asia-northeast1').https.onCall(async (data, context) => {

  // 以下、firestoreを使った処理

})