LoginSignup
8
6

More than 1 year has passed since last update.

Cloud FunctionsのHttpsErrorのコード属性と内容について

Last updated at Posted at 2021-12-05

はじめに

クライアントから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でテストしてみると、レスポンスは以下のようになります。

スクリーンショット_2021-12-05_16.14.39.jpg

おわりに

httpsCallable関数は、HTTPリクエスト経由で関数を呼び出した時のような、

res.status(400).send("エラーが発生しました。")

の記述はできないようなので、エラー属性の表を参考にエラーハンドリングの実装をしてみて下さい。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6