Open7
【Flutter】cloud_functions【備忘録】
// クライアント 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);
}
HTTP リクエスト経由で関数を呼び出す
onRequest() の引数として Request オブジェクトを使用すると、クライアントから送信された HTTP リクエストのプロパティにアクセスできます。Response オブジェクトを使用すると、クライアントにレスポンスを返すことができます。
// HTTP リクエストでの関数のトリガー
exports.date = functions.https.onRequest((req, res) => {
// ...
});
【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×=5&gone=true
参考
【011】Cloud Functionsの概要【Firebase】
デプロイが出来ない($firebase deploy)
エラー
WEBブラウザでURLをクリックしてCloud Functionsを実行すると、以下のエラー表示
Error: could not handle the request
// エラーの原因を特定する
$ firebase functions:log
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