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();