25
13

More than 3 years have passed since last update.

エミュレータで動作しているFirebase firestore, functionsにアクセスする

Posted at

FirebaseのエミュレータはHostingやFunctions(WebAPI)を開発するときには便利で使い方も明確なのですが、firestoreやFunctions(onCall)のときにどう使うのかがわからなかったのでメモ。

エミュレータの実行

エミュレータ自体は

firebase serve --only hosting, functions, firestore

などとすることで利用できる。

firebase emulators:start --only hosting...としたときと挙動が違うらしいが、それは別途調査。

Firestore

正直、rulesのテスト以外にどう使うのかわからない。@firebase/testingを利用すると利用されるのは知っていたが、そもそも普通のアプリをローカルテストする際などに利用できるものなのか(@firebase/testing以外から利用できるのか)とか。

結論から言えば できる みたい。

こことかに書いている。

コードで指定する

firebase.firestore().setting()にて接続先を指定することでエミュレータを利用できるよう。
initializeApp()での設定は無視されるよう。

const firebase = require('firebase');

const firebaseConfig = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxx.firebaseapp.com",
    databaseURL: "https://xxxxxxxxx.firebaseio.com",
    projectId: "xxxxxxxxx",
    storageBucket: "xxxxxxxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxxxxx",
    appId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    measurementId: "xxxxxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();

//settingにエミュレータを利用するように記述
db.settings({
    host: "localhost:8080",
    ssl: false,
});

const main = async () => {

    const res = await db.collection("items").add({
        name: "hoge",
        age: 13,
    })

}

main();

環境変数で指定する(継続調査)

また、ネットには

FIRESTORE_EMULATOR_HOST=localhost:8080

というような形で環境変数を設定すれば、エミュレータ上のFirestoreを見に行ってくれるよ!みたいに書いている記事がいくつかあったのですが、軽く試した感じでは動かなかったので、継続調査とする。誰か教えて。

Functions

FunctionsでもWebAPI(onRequest)の場合は難しくないがCallable()等の際どうしたらいいかわからなかった。
firebase.functions().useFunctionsEmulator()というので接続先としてローカルを設定すると良いらしい。

Functionsの場合、環境変数で指定するような方法はなさそう。

const firebase = require('firebase');

const firebaseConfig = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxx.firebaseapp.com",
    databaseURL: "https://xxxxxxxxx.firebaseio.com",
    projectId: "xxxxxxxxx",
    storageBucket: "xxxxxxxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxxxxx",
    appId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    measurementId: "xxxxxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);

const db = firebase.firestore();
const functions = firebase.functions();
//接続先指定
functions.useFunctionsEmulator('http://localhost:5000');


const main = async () => {

    //Callable functionを利用
    const helloOnCall = functions.httpsCallable("helloOnCall");
    const res = await helloOnCall({});
    console.log(res);

}

main();
25
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
13