Open7

【Flutter】cloud_functions【備忘録】

sho5sho5

https://firebase.google.com/docs/functions/callable#dart_1

// クライアント SDK を初期化する
final functions = FirebaseFunctions.instance;
// 関数を呼び出す
final result =
    await FirebaseFunctions.instance.httpsCallable('addMessage').call();
// クライアントでエラーを処理する
try {
  final result =
      await FirebaseFunctions.instance.httpsCallable('addMessage').call();
} on FirebaseFunctionsException catch (error) {
  print(error.code);
  print(error.details);
  print(error.message);
}


sho5sho5

HTTP リクエスト経由で関数を呼び出す

https://firebase.google.com/docs/functions/http-events

onRequest() の引数として Request オブジェクトを使用すると、クライアントから送信された HTTP リクエストのプロパティにアクセスできます。Response オブジェクトを使用すると、クライアントにレスポンスを返すことができます。

// HTTP リクエストでの関数のトリガー
exports.date = functions.https.onRequest((req, res) => {
  // ...
});
sho5sho5

【Cloud Functions】HTTPSリクエストのサンプルコード【Node.js】

【概要】行きたい国と都市名を保存し、サブコレクションに行ったかどうかと行った回数を保存

このサンプルコードで出来ること
  • HTTPSリクエストの使用
  • 上記に変数を埋め込む
  • Firestoreのコレクションとサブコレクションに値を登録
  • 文字列、数値、真偽値をそれぞれ登録
  • 完了後にWebブラウザに文字列を表示
  • ステータスコードを返す
terminal
$ firebase login

// 初期化 (エラーが出る場合は一度ログアウト)
$ firebase init

// もしくはこれ?
// $ firebase init functions
functions/index.js
//-----------------------------------------------------------------
// Firestoreに登録
//-----------------------------------------------------------------
// 必要なモジュールをインポートし、アプリを初期化
const functions = require('firebase-functions');
const admin = require('firebase-admin'); // FirestoreにアクセスするためのFirebase Admin SDK
admin.initializeApp();

// regionの設定
const region = "asia-northeast1";

// 関数
exports.updateCities = functions.region(region).https.onRequest(async (req, res) => {

    // Firestoreのコレクション
    const citiesRef = admin.firestore().collection('cities');

    // 取得した変数
    const docId = req.query.id;
    const subId = req.query.subId;
    const country = req.query.country; // 文字列
    const city = req.query.city; // 文字列
    const times = Number(req.query.times); // 数値
    const gone = JSON.parse(req.query.gone.toLowerCase()); // 真偽値

    // Firestoreへの登録処理
    await citiesRef.doc(docId).set({
        country: country,
        city: city,
    }, { merge: true });

    // Firestoreへの登録処理(サブコレクション)
    await citiesRef.doc(docId).collection('gone').doc(subId).set({
        times: times,
        gone: gone,
    }, { merge: true });

    // 書き込み後にメッセージを返す("status()"は任意)
    // HTTP関数は必ず send()、redirect()、end() を使用して終了させる
    res.status(200).send(country + " - " + city);
});
functions/package.json
// 任意のバージョンへ変更
  "engines": {
    "node": "14"
  },

// 不足している場合は追記
  "dependencies": {
    "firebase-admin": "^10.0.2",
    "firebase-functions": "^4.0.0"
  },
terminal
// デプロイ
$ firebase deploy --only functions

// もしくはこちら
$ firebase deploy --only functions:関数名 
// 例)$ firebase deploy --only functions: updateCities
// 関数名:exports.updateCities = functions.region(region)〜

HTTPSリクエストの例

  • 以下のURLを使うと関数が実行される
  • "?id=" 以降は変数として渡されるもの
  • XXXXXXは各自のDB名
// 以下をブラウザの検索バーに貼ることで関数を実行
https://asia-northeast1-XXXXXX.cloudfunctions.net/updateCities?id=abc&subId=def&country=japan&city=fukuoka&times=5&gone=true
sho5sho5

デプロイが出来ない($firebase deploy)

sho5sho5

エラー

WEBブラウザでURLをクリックしてCloud Functionsを実行すると、以下のエラー表示

Error: could not handle the request
// エラーの原因を特定する
$ firebase functions:log
sho5sho5

VSCodeでFireseプロジェクトを切り替えられない

// このエラーがターミナルに表示される
Error: Failed to get Firebase project XXXXXXXX. Please make sure the project exists and your account has permission to access it.

Firebaseのプロジェクトを指定する方法

// 現在のプロジェクト確認
$ firebase target

// プロジェクト一覧
$ firebase projects:list

プロジェクト一覧が表示される

Project Display Name Project ID Project Number Resource Location ID
XXXX XXXX-ID 0000000000 asia-northeast1
YYYY YYYY-ID 1111111111 asia-northeast1
// プロジェクトを指定
firebase use XXXX-ID

https://piitre.com/blog/programming/firebase-cli-change-project/