Firebase Cloud Function をローカルで実行するときにはまった点

この記事は、「個人開発サービスに用いられている技術 Advent Calendar 2018」17日目の記事です。

現在、個人開発で3プラットフォーム対応アプリを作っているが、バックエンドをFirebaseにしていわゆるサーバーレスで開発を進めている。
FirebaseのCloud Functionsを使うにあたって、毎回Firebase上にデプロイしてテストするのは時間がかかって面倒なので、Cloud Functionsをローカルで実行する方法と、はまった点をまとめる。

ローカルでCloud Functionsを実行する方法

下記の3つの方法がある。

今回はhttp系以外のローカル実行を行いたいのでCloud Functionsシェルを使う。

準備

プロジェクトディレクトリにて下記を実行。

$ npm install --save [email protected]
$ npm install -g firebase-tools

これで functions/ が生成されるはず。

TypeScriptで処理を記述している場合

TypeScriptでCloud Functionsの処理を記述する場合、Cloud Functionsのテストやデプロイ前に下記のようなトランスパイルが必要(デプロイ時は自動で行ってくれるが)。

$ cd /project directory/functions/
$ npm run build

毎回この処理を行うのは面倒なので自動でトランスパイル処理が走るように設定しておく。
2つの方法があるのでお好みで。

方法1:別のターミナルを開いてwatch処理を走らせておく。
$ cd /project directory/functions/
$ ./node_modules/.bin/tsc --watch

上記を実行しておけば自動トランスパイルされるようになる。

方法2:Visual Studio Codeのビルドタスク設定を使う

Command + Shift + B でwatchのビルドタスクを下記のように選択し、
894DE094-A585-4222-9767-4FD55C30CED7.png
するとターミナルが下記のようになる。
スクリーンショット 2018-12-06 23.08.09.png
これで自動トランスパイルされるようになる。
この状態のまま、赤枠部分をクリックして、いつものターミナルに切り替えて作業を進める。

Cloud Functionsシェルの起動

$ cd /project directory/functions/
$ firebase experimental:functions:shell

これで対話式でCloud Functionsの関数を呼び出すことができる。
どのように実行するかは、公式や他のブログにもまとめられているので、注意点を記す。

注意点1

Cloud Funcitonsをローカルで実行しても、Firestoreへの処理はFirebase上の本番データに対して行われる(回避する方法あるかも)。
なので、存在しないFirestoreのドキュメントに対して処理を行おうとすると下記のようなエラーがでる。

No document to update:
注意点2

Cloud Functionsシェルにはドキュメント名のワイルドカードをシミュレートするための paramsオプションが用意されている。

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})
注意点3

Cloud Functionsシェルは5001番ポートで動くが、もし他のプロセスがそこで走っている場合、シェル起動時に下記のエラーがでて動作がおかしくなる。

error: restPort (5001) is already in use

この場合は思い切って5001番を占有しているプロセスを強制終了させる。

$ sudo lsof -i tcp:5001
でプロセスIDを取得し
$ sudo kill -9 プロセスID

自己責任でお願いします。

注意点4

パラメータにjavascriptの関数を渡すことができる。
例:

firebase > onChatTest({sendDateTime: new Date() })
注意点5

環境変数をセットしている場合、下記のコマンドで予めランタイム設定ファイルを生成しておく必要がある。

firebase functions:config:get > .runtimeconfig.json

以上。


Shinji 爆速でアプリとかwebサービス作りたい人

ベトナムで開発会社を立ち上げて7年目。日中は経営とチーム開発、夜は個人開発者としてエンジニア向けの英語学習サイト エンジリッシュ https://t.co/BInYt6Rwrh や日程調整アプリ アイテマス https://t.co/GXYFqGyEHF 作ってます!

Crieitはβバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

関連記事

コメント