その仕組みを簡単に説明しましょう。ここでは、例として Realtime Database トリガーを取り上げます。
既存のプロジェクトに makeUppercase という 1 つの関数があるとします。これはまだデプロイされておらず、index.js で次のように定義されています。
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original').onCreate(event => {
const original = event.data.val()
console.log('Uppercasing', event.params.pushId, original)
const uppercase = original.toUpperCase()
return event.data.ref.parent.child('uppercase').set(uppercase)
})
この onCreate データベース トリガーは、original という子要素を持つ新しいメッセージが /messages の下にプッシュされた場合に実行され、uppercase という新しい子要素に、大文字化したオリジナルのメッセージの値を書き込みます。
では、Firebase CLI を使ってコマンドラインからエミュレータ シェルを起動してみましょう。
$ cd your_project_dir
$ firebase experimental:functions:shell
すると、次のように表示されます。
i functions: Preparing to emulate functions.
✔ functions: makeUppercase
firebase>
firebase というプロンプトが表示され、makeUppercase 関数を起動するコマンドが発行されるのを待つ状態になります。
データベース トリガーのテストについて記載されたドキュメントによると、次の構文を使うと、入力データを伴うイベントを記述して関数を実行できます。
makeUppercase('foo')
これによって、文字列値 "foo" が設定された、original という子要素を持つ新しいメッセージ オブジェクトが /messages の下にプッシュされた際に生成されるイベントのトリガーがエミュレートされます。シェルでこのコマンドを実行すると、コンソールには次のように出力されます。
info: User function triggered, starting execution
info: Uppercasing pushId1 foo
info: Execution took 892 ms, user function completed successfully
関数内のコンソール ログが出力され、データベース パス内にあるワイルドカードである pushId には、pushId1 という値が
自動的に 割り当てられていることがわかります。とても便利ですね!さらに、必要に応じて、ワイルドカードの値を自分で指定することもできます。
makeUppercase('foo', {params: {pushId: 'custom_push_id'}})
関数をエミュレーションした後でデータベースの内部を見てみると、表示された関数の結果を確認できます。/messages/{pushId}/uppercase には、大文字化された文字列値 "FOO" が設定されています。
この方法を使うと、すべてのデータベース イベント(onCreate、onDelete、onUpdate、onWrite)をシミュレートすることができます。各イベントを正しく起動する方法については、ドキュメントをご覧ください。
データベース トリガーだけでなく、
HTTPS 関数、
PubSub 関数、
Analytics 関数、
Storage 関数、
Auth 関数のエミュレーションも実行でき、それぞれ独自の構文が存在します。
Cloud Functions シェルは、現在試験運用版として提供されているため、不十分な点もあるかもしれません。問題を発見した場合は、
バグレポートを送信してお知らせください。
Firebase Slack の #functions チャンネルで他の Cloud Functions ユーザーと話すこともできます。
シェルを活用するにあたってのヒント
毎回関数を起動するコマンドを打ち込むのは苦痛です。そのため、シェルのコマンドラインの履歴を表示するのと同じように、矢印キーで起動履歴を表示して再利用しましょう。
また、このシェルは、任意の JavaScript コードを実行したり、
特殊な REPL コマンドやキーを利用したりできる完全な
node REPL であることも覚えておきましょう。これは、テストコードのスクリプトを記述する際に役立つかもしれません。
任意のコードを実行できるので、おなじみの require() 関数を使ってコードを別のファイルから動的に読み込んで実行することもできます。
最後に、私のように
VS Code などのプログラマー用エディタで JavaScript を書いている方は、Firebase CLI に実行したいコードを送信して簡単に関数をエミュレートすることができます。次のコマンドは、標準入力を通してリダイレクトされるファイルからテストコードを実行します。
$ firebase experimental:functions:shell < tests.js
ぜひ活用してみてください。
Reviewed by
Khanh LeViet - Developer Relations Team