結論
Flutter側でリージョンを指定してるのにも関わらずうまくいかない!ってときは、
httpsCallable('関数名')
の中に入れる関数名が正しいかを確認しましょう!
※CloudFunctions内で定義した関数名そのままでは正しくない可能性があります!
起こった問題
Stripeのセッションを作成するためにCloudFunctionsにてAPIを実装し、FlutterからhttpトリガーでCloudFunctionsを実行させる時に下記エラーに直面しました。
Flutterではcloud_functions
ライブラリを使用
私の場合、createRegattaCheckout
という関数をCloudFunctions側で定義し、Flutterから呼び出そうとしています。
import * as functions from 'firebase-functions';
export const createRegattaCheckout = functions
.region(locationName)
.https.onCall(async (data, context) => {
// 中身は省略
}
import 'package:cloud_functions/cloud_functions.dart';
final functions = FirebaseFunctions.instanceFor(app: Firebase.app(), region: 'asia-northeast1');
final callable = functions.httpsCallable('createRegattaCheckout');
final results = await callable.call();
しかし下記エラーにてスタック!
[エラーメッセージ]
Unhandled Exception: [firebase_functions/3840] データのフォーマットが正しくないため、読み込めませんでした。
試したこと
下記記事を参考に、Flutter側でリージョンを指定(region: 'asia-northeast1'
)してみました。。
がうまくいかず。。。
解決策
FlutterのhttpsCallable('関数名')
部分において、関数名を修正する。
(私の場合、createRegattaCheckout-createRegattaCheckout
でした。)
関数をindex.ts
内に記述しているのではなく、モジュールに分けていたことが原因かも。。
Firebaseが実際に認識している関数名を入れる必要がある。
関数名の確認方法
1. Firebase Consoleから確認
Firebase ConsoleのFunctions
タブ内のダッシュボードをみると実際にFirebaseが認識している関数名を確認することができます。
2. デプロイ時のログから確認
$ firebase deploy --only functions:createRegattaCheckout
<省略>
i functions: uploading functions in project: createRegattaCheckout-createRegattaCheckout(asia-northeast1)
i functions: updating Node.js 12 function createRegattaCheckout-createRegattaCheckout(asia-northeast1)...
✔ functions[createRegattaCheckout-createRegattaCheckout(asia-northeast1)]: Successful update operation.
<省略>
最後に
結果的にはしょうもないことでしたが、自分は地味にハマって辛かったので、
同じ思いをする人がいませんようにと本記事をまとめました。