firebase functionsでサーバレスAPI
create: 2018-10-10
JavaScript Firebase firebase functions

hello firebase functions

firebase で functions。
functionsfirebaseのサービスの中で、Node.jsによる関数を実行できるすごいやつです。
サーバサイドプログラムを動かすのに自分でサーバを用意する必要がないんです!

いままでherokuなどを使っていましたが、無料の spark 枠でも使えるので、簡単な API を作って動かしてみました。

firebase-tools のインストール

公式サイトに書いてあるとおりです。
npmyarnを使ってグローバルにインストールします。

npm install -g firebase-tools

functions を使う準備

使いたいプロジェクトで以下を実行。
ウィザードに従って、JavaScript か TypeScript か選べぇ?

firebase init functions

これで空のfunctionsディレクトリが作成される。

関数の作成

functionsディレクトリが作成されたら、直下にindex.jsを作成。

const functions = require('firebase-functions');

// 受け取ったメッセージをJSONに詰めて返すだけの関数
exports.echoMessage = functions.https.onRequest((req, res) => {
	res.json({echo: req.query.text});
	res.end(); // Responseオブジェクトを閉じておかないと怒られる
});

ローカルテスト

ちんけなプログラムなので、そのままノーテストでデプロイしてもいいけど、一応ローカルで動作確認。

firebase serve --only functions


=== Serving from '/Users/nekoha/develop/hexo-blog'...

i  functions: Preparing to emulate functions.
Warning: You're using Node.js v9.11.2 but Google Cloud Functions only supports v6.11.5.
✔  functions: echoMessage: http://localhost:5000/[プロジェクト名]/us-central1/echoMessage
info: User function triggered, starting execution
info: Execution took 14 ms, user function completed successfully
info: User function triggered, starting execution
info: Execution took 1 ms, user function completed successfully

自作 API の URL が表示されています。
今回だとhttp://localhost:5000/[プロジェクト名]/us-central1/echoMessageで待ち受けていますね。

クエリパラメータを受け取って返す関数なので、curlコマンドから?text=helloworldを付けて実行してみましょう。
[プロジェクト名]のところは自分のプロジェクト名が入っているはずです。

curl http://localhost:5000/[プロジェクト名]/us-central1/echoMessage?text=helloworld
# {"echo":"helloworld"}

{"echo":"helloworld"}と表示されれば成功です!

デプロイ

firebase deploy --only functions

デプロイが成功すると、アクセスするための URL が表示されます。
これをメモっておきましょう。
忘れても大丈夫。プロジェクトコンソールからも確認できます。

動作確認

いよいよ動作確認です。
先程メモった URL をcurlコマンドからリクエストします。
クエリパラメータ?text=helloworldを付けて実行してみましょう。

curl https://us-central1-[プロジェクト名].cloudfunctions.net/echoMessage?text=helloworld
# {"echo":"helloworld"}

{"echo":"helloworld"}と表示されれば成功です。
大したこともせずに API を作成することができました!