Google Cloud Functions を Express で実装し Firebase Hosting の Angular から呼び出す
Cloud Functions の中身を Express に置き換え、カスタムドメインを設定した。
以前行った、Firebase Hosting 上の Angularから呼び出し同様、疎通を確認するところまで、いくつかハマりポイントがあったので、留意点をメモ。
1.Functions側の実装
以下留意点
- https.onCall の仕様として、HTTP POSTメソッドでうける必要がある
- ローカルからテスト呼び出しすると、CORSににひっかかるので、Access-Control-Allow・・・ ヘッダを指定する
- 応答のJSONの結果をdata フィールドに指定する
import * as functions from 'firebase-functions'; import * as express from 'express'; const app: express.Express = express(); app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); const router: express.Router = express.Router() app.use(router); router.post('/api/test', (req, res) => { res.json({'data':{'result':'ok'}}); }); export const apiService = functions.https.onRequest(app);
2.呼び出しAngular側の実装
- httpsCallable に パスを指定できる
import { Injectable } from '@angular/core'; import { Observable, from } from 'rxjs'; import { AngularFireFunctions } from '@angular/fire/functions'; @Injectable({ providedIn: 'root' }) export class HogeService { apiFunc : any; constructor( private functions: AngularFireFunctions ) { this.apiFunc = this.functions.httpsCallable('apiService/api/test'); } async calc() { const obs = this.apiFunc() as Observable; let res = await obs.toPromise(); console.log(res); } }
3.実行結果
3.1 Firebase エミュレータによる動作確認
$ firebase emulators:start で実行、Visual Studio Codeの URLを Command+クリックでコンソール起動
エミュレーターコンソール画面が起動するので、Hostingエミュレーターからページを開き、上記実装したページから Functionsを呼び出す。
想定した結果が取得できたOK!
ちなみに、firebaseにデプロイし、ng serve で単独でangular をローカルで実行しても同様の結果を得ることができた。