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+クリックでコンソール起動

EMU START

エミュレーターコンソール画面が起動するので、Hostingエミュレーターからページを開き、上記実装したページから Functionsを呼び出す。

Emulator OK

想定した結果が取得できたOK!

RESULT JSON

ちなみに、firebaseにデプロイし、ng serve で単独でangular をローカルで実行しても同様の結果を得ることができた。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です