スキップしてメイン コンテンツに移動

投稿

ラベル(firebase)が付いた投稿を表示しています

firebase emulatorへ他のコンピュータから接続させる方法

firebaseのエミュレーターのサービスをネットワーク上の他のコンピュータから接続させる方法を紹介します。 firebase.jsonに "host": "0.0.0.0" の設定を加えます。下記はfunctionsに設定を加えた例です。 "emulators" : { "functions" : { "port" : 5001 , "host" : "0.0.0.0" } , "firestore" : { "port" : 8080 } , "hosting" : { "port" : 5000 } } サーバでは、0.0.0.0は「ローカルマシン上の全てのIPv4アドレス」を意味するので、上記の設定で、firebaseのエミュレータを起動すると、同じネットワークの他のホストからもアクセスできるようになります。 WindowsのFirewallの設定で他のコンピュータから接続させたいポートを開けます。 タスクバーの検索メニューに「Windows Defender Firewall with Advanced Security」と入力してFirewallの設定を開く。 左側のメニューから「Inbound Rules」を選択して、右側のメニューから「New Rule…」を選択して「New Inbound Rule Wizard」を起動。 Rule Type: Portを選択。 Protocol and Ports: TCP, firebaseのエミュレータで開けたいポートを入力 Action: Allow the connectionを選択。 Profile: ネットワーク環境に応じて選択。家や社内のネットワークで利用するだけならば、Privateで十分なはず。 Name: 適当な名前を付ける。

Firebaseでエミュレータを設定(確認)する方法

サーバサイドのfirebase-adminの場合 Node.jsを利用したサーバー側では、 process.env を参照するとFirebase functionsの実行環境の情報を取得できます。 firebase-admin を利用したエミュレータ環境の設定も process.env から確認できます。index.jsに下記のログ出力を加えてみます。 console.log(JSON.stringify(process.env, null, 3)); firebase emulators:start を実行してエミュレータ環境でfirebaseを起動させると、エミュレータの設定状況に応じて、下記のようなエントリがログ出力されます。 "FIREBASE_AUTH_EMULATOR_HOST" : "localhost:9099" "FIREBASE_DATABASE_EMULATOR_HOST" : "localhost:9000" , "FIREBASE_STORAGE_EMULATOR_HOST" : "localhost:9199" , "FIRESTORE_EMULATOR_HOST" : "localhost:8080" , "FUNCTIONS_EMULATOR" : "true" index.js内で firebase-admin から作成されたサービスはすべてエミュレータに接続されます。 const admin = require ( 'firebase-admin' ) ; admin . initializeApp ( { credential : admin . credential . cert ( "XXXXXXXX.json" ) , storageBucket : "YYYYYYY.appspot.com" , } ) ; admin . firestore ( ) ; admin . storage (...

Firebase functionでPromiseをreturnしないとPromise内の処理が不安定になる

Node.jsでfirebase functionsを開発していると、Promiseを使う場面が多いと思いますが、Promiseをfunctionでreturnしないと、functionの処理に非常に時間がかかったり、処理が非常に不安定になるようです。 const myPromise = new Promise ( ( resolve , reject ) => { // なんか処理 } ) ; // myProimise内での処理とは無関係にfunctionのレスポンスを返す。→ 不安定 exports . notReturnPromise = functions . https . onCall ( ( data , context ) => { myPromise . then ( ( ) => { } ) ; return { "code" : "success" } ; } ) ; // myProimise内での処理が終わったらfunctionのレスポンスを返す。→ レスポンスは遅くなるが安定 exports . returnPromise = functions . https . onCall ( ( data , context ) => { return myPromise . then ( ( ) => { return { "code" : "success" } ; } ) ; } ) ; 筆者の環境ではPromiseをreturnしなかった場合、下記のような不具合が多発しました。 Cloud Storageへのアップロードに時間がかかったり、SSLの認証で落ちる firestoreのtransaction処理でエラーが多発 timeout transaction missingなどなど functionでPromiseをreturnするようにしたところ、上記の問題は発生しなくなりました。 functionはPromiseがresolveされるまで、レスポンスを返さないので、Promiseのresol...

firestoreでAuto Incrementフィールドを作成

FirestoreでAuto Increment Fieldを作成 Firestoreで連番となるフィールドの作成方法を紹介します。 肝はFirestoreのtransactionを使って原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)を保証することです。 汎用的に使えるgenerateSequenceNumber関数を作成してみました。 manage_collection: 連番を生成するターゲットcollectionを管理するcollection名 target_collection: 連番を生成するターゲットとなるcollection名 numberField: 連番を生成したいフィールド名 を渡して使います。 function generateSequenceNumber ( db , manage_collection , target_collection , numberField ) { const docRef = db . collection ( manage_collection ) . doc ( target_collection ) ; return db . runTransaction ( ( transaction ) => { return transaction . get ( docRef ) . then ( ( doc ) => { if ( ! doc . exists ) { transaction . set ( docRef , { [ numberField ] : 1 } ) ; return 1 ; } const newNumber = typeof doc . data ( ) [ numberField ] === 'undefined' ? 1 : doc . data ( ) [ numberField ] + 1 ; await transaction . update ( docRef , { [ numberField ...

Firebase Toolsコマンドが実行ポリシーの設定が原因で実行できない問題の解決法

Firebase ToolsをインストールしてWindows PowerShell上からfirebaseコマンドを実行したのですが、下記の実行ポリシー関連のエラーが発生して正常に実行できませんでした。 PS C:\\Users\\user > firebase firebase : File C:\\Users\\user\\AppData\\Roaming\\npm\\firebase.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID = 135170. At line:1 char:1 + firebase + ~~~~~~~~ + CategoryInfo : SecurityError: ( : ) [ ] , PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess このあたりを参考に https://tecadmin.net/powershell-running-scripts-is-disabled-system/ 、管理者(Administrator)権限でPowerShellを開き、下記のコマンドを実行して解決しました。 PS C:\\Users\\user > Set-ExecutionPolicy RemoteSigned

Webのフロント側でもとのfirebaseの初期設定をコピーして新しいfirebaseインスタンスを作成する方法

frontendのWeb側で、 firebase.app().options を利用して、もとのfirebaseインスタンスと同じ設定のインスタンスを作成する方法の紹介です。 firebase.app().options の中身をJSON形式で表示させると、下記のように、firebaseのインスタンスの初期化時のoptionsが取得できます。 { "projectId" : "project_id" , "appId" : "1:XXXXXXXXXXXX:web:XXXXXXXXXXXXXXXXXXX" , "storageBucket" : "project_id.appspot.com" , "locationId" : "asia-northeast1" , "apiKey" : "XXXXXXXXXXXXXXXXXXXXXX" , "authDomain" : "project_id.firebaseapp.com" , "messagingSenderId" : "11111111111111" , "measurementId" : "G-XXXXXXXX" } この firebase.app().options をそのままfirebase.initializeAppの引数に渡すことで、もとのfirebaseインスタンスと同じ設定のインスタンスを作成することができます。 const newFirebase = firebase . initializeApp ( firebase . app ( ) . options , 'newFirebaseApp' ) ;

FirebaseのEmulatorを利用する際にJavaをインストール

Firebaseのエミュレータ起動に失敗 Windows環境で firebase emulators:start コマンドを実行してFirebaseのエミュレータを起動しようとしたところ、下記のようなエラーが発生しました。 i firestore: Firestore Emulator logging to firestore-debug.logosting ! firestore: Fatal error occurred: s are not running, calls to these services from the Functions emulator will affect p Firestore Emulator has exited because java is not installed, you can install it from https://openjdk.java.net/install/, Your requested "node" version "10" doesn't match your global version "14" stopping all running emulatorsirestore-emulator-v1.11.15.jar... i functions: Stopping Functions Emulator i firestore: Stopping Firestore Emulator ! firestore: Error stopping Firestore Emulator 解決法 Javaがインストールされていないとのエラーメッセージなので、 AdoptOpenJDK をインストールします。この記事を書いている時点でのLTSのJava 11をインストールして無事起動するようになりました。