実装手順
❶ パッケージを用意する
yarn add firebase firebase-tools
❷ package.jsonを編集する
package.json
{ "name": "gps-distance", "scripts": { "login": "firebase login", "init": "firebase init", "emulate": "firebase emulators:start", "deploy": "firebase deploy" }, "dependencies": { "firebase": "^10.13.0", "firebase-tools": "^13.15.3" } }
❹ Firebaseプロジェクトを初期化する
ログイン
yarn run login
初期化
yarn run init
初期化後、❸で作成したプロジェクトに紐付けます。
必要なものを有効化
◉ Functions: Configure a Cloud Functions directory and its files ◉ Emulators: Set up local emulators for Firebase products
必要なエミュレータを有効化
◉ Functions Emulator
いろいろ選択肢が出てきますが、基本的にEnterを連打でOKです。
❺ コードを書く
functions/index.js
const { Geodesic } = require('geographiclib-geodesic'); const { onRequest } = require('firebase-functions/v2/https'); const { initializeApp } = require('firebase-admin/app'); const logger = require('firebase-functions/logger'); exports.distance = onRequest({ region: ['asia-northeast1'], }, async (request, response) => { // ?target[]=座標Aの緯度,座標Aの経度&target[]=座標Bの緯度,座標Bの経度というパラメータを想定 const { target } = request.query; if (target && target.length === 2) { try { const [ latA, longA ] = target[0].split(','); const [ latB, longB ] = target[1].split(','); const r = geod.Inverse( Number(latA), Number(longA), Number(latB), Number(longB), ); response.send({ distance: r.s12.toFixed(2) }); } catch (err) { logger.error(err); } } response.send({ distance: (0).toFixed(2) }); });
❻ エミュレータで確認する
yarn emulate
http://127.0.0.1:4000/logs?q=metadata.emulator.name%3D%22functions%22 にアクセスすると、デプロイしたfunctionのURLが確認できます。
関数名は、http://127.0.0.1:(ポート番号)/(プロジェクト名)/(リージョン)/(関数名)となるので、
- functionsのポートを「5001」
- プロジェクト名が「gps-distance」
- リージョンが「asia-northeast1(東京)」
- 関数名が「distance」
ならば、
http://127.0.0.1:5001/gps-distance/asia-northeast1/distance
となります。
ブラウザでアクセスしてみると、2点間の距離が返ってきます。
👆は鎌倉駅(35.31902777,139.55041666)と横浜駅(35.4660694,139.6226196)の直線距離(18305.42m)です。
❼ デプロイする
yarn deploy
今回は以上です。