はじめに
クライアントからCloud Functionsの関数を呼び出すことが可能なhttpsCallable関数のエラーを処理するためには、functions.https.HttpsErrorのインスタンスをスローする必要があります。
ですが、エラーのコード属性に何があるのか分からなかったので、型定義ファイルから読み取っていきます。
コード属性一覧
型定義ファイルには、Cloud Functionsのコード属性はgRPCと同一という記述があります。
The set of Firebase Functions status codes. The codes are the same at theones exposed by gRPC here:
https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
中身をまとめると、以下の表のようになります。
コード属性 | ステータス | 内容 |
---|---|---|
ok | 200 OK | エラーではありませんでした。 |
invalid-argument | 400 Bad Request | クライアントが無効な引数を指定しました。 |
failed-precondition | 400 Bad Request | システムが操作の実行に必要な状態にないため、操作が拒否されました。 |
out-of-range | 400 Bad Request | 有効な範囲を超えて操作が試行されました。 |
unauthenticated | 401 Unauthorized | 操作に有効な認証情報がありません。 |
permission-denied | 403 Forbidden | 呼び出し元には、指定された操作を実行する権限がありません。 |
not-found | 404 Not Found | 一部のリクエストされたエンティティ(ファイルやディレクトリなど)が見つかりませんでした。 |
already-exists | 409 Conflict | クライアントが作成しようとしたエンティティ(ファイルやディレクトリなど)はすでに存在します。 |
aborted | 409 Conflict | 同時実行の問題が原因で、操作が中止されました。 |
resource-exhausted | 429 Too Many Requests | ファイルシステム全体の容量が不足している可能性があります。 |
cancelled | 499 unknown | 呼び出し元によって操作がキャンセルされました。 |
unknown | 500 Internal Server Error | 未知のエラー。十分なエラー情報を返さないAPIによって発生したエラーは、このエラーに変換される可能性があります。 |
internal | 500 Internal Server Error | 内部エラー。システムの不変条件が壊れていることを意味します。 |
data-loss | 500 Internal Server Error | 回復不能なデータの損失または破損。 |
unimplemented | 501 Not Implemented | 操作が実装されていないか、サポート/有効化されていません。 |
unavailable | 503 Service Unavailable | このサービスは現在ご利用いただけません。 |
deadline-exceeded | 504 Gateway Timeout | 操作が完了する前にタイムアウトしました。 |
実際にhttpsCallable関数でfunctions.https.HttpsErrorのインスタンスをスローすると以下のようになります。Cloud Functionsの環境はTypescriptを使用しています。
export const errorCheck = functions.https.onCall((data, context) => {
throw new functions.https.HttpsError('invalid-argument', '無効な引数を指定されました。');
})
第一引数にコード属性、第二引数にエラーメッセージ、オプションとして第三引数に詳細メッセージを渡すことが可能です。
実際にPostmanでテストしてみると、レスポンスは以下のようになります。
おわりに
httpsCallable関数は、HTTPリクエスト経由で関数を呼び出した時のような、
res.status(400).send("エラーが発生しました。")
の記述はできないようなので、エラー属性の表を参考にエラーハンドリングの実装をしてみて下さい。