エラーとエラー処理

Datastore モードの Firestore のリクエストに成功すると、API はリクエストされたデータと HTTP 200 OK ステータス コードをレスポンスの本文で返します。

リクエストが失敗すると、Datastore API は失敗の概要を表す 4xx または 5xx ステータス コードと、失敗の原因となったエラーの詳細情報を含むレスポンスを返します。

このページの残りの部分では、エラーの構造について説明し、具体的なエラーコードを列挙します。また、推奨される対処方法も示します。

JSON リクエストのエラー レスポンスの構造は次のとおりです。

{
  "error": {
    "code": "integer",
    "message": "string",
    "status": "string"
  }
}

レスポンス オブジェクトには単一のフィールド error が格納されており、その値には次の要素が格納されています。

要素 説明
code リクエストの失敗をおおまかに識別する HTTP ステータス コード
message リクエストの失敗に関する具体的な情報
status Google API の標準的なエラーコードgoogle.rpc.Code)。Datastore API から返されるコードについては、エラーコードをご覧ください。

次に、JSON リクエストに対するエラー レスポンスの例を示します。

{
  "error": {
    "code": 400,
    "message": "Key path is incomplete: [Person: null]",
    "status": "INVALID_ARGUMENT"
  }
}

コンテンツ タイプが application/x-protobuf のリクエストがエラーになると、シリアライズされた google.rpc.Status メッセージがペイロードとして返されます。

エラーコード

エラーの分類におすすめする方法は、標準的なエラーコードgoogle.rpc.Code)の値を調べることです。JSON エラーの場合、このコードは status フィールドに表示されます。application/x-protobuf エラーでは、code フィールドに表示されます。

標準的なエラーコード 説明 推奨される対応
ABORTED リクエストが別のリクエストと競合していることを示します。 非トランザクション commit の場合:
リクエストを再試行するか、競合がなくなるようにエンティティを構築します。

トランザクション commit に含まれるリクエスト:
トランザクション全体を再試行するか、競合がなくなるようにエンティティを構築します。
ALREADY_EXISTS リクエストが既存のエンティティを挿入しようとしていることを示します。 問題を解決してから再試行します。
DEADLINE_EXCEEDED サーバーでの期限を超過しました。 指数バックオフを使用して再試行します。
FAILED_PRECONDITION リクエストの前提条件が満たされていなかったことを示します。エラー レスポンスのメッセージ フィールドで、失敗した前提条件に関する情報が提供されます。考えられる原因の 1 つとして、クエリが未定義のインデックスを必要としていることが挙げられます。 問題を解決してから再試行します。
INTERNAL サーバーがエラーを返しました。 このリクエストを複数回再試行しないでください。
INVALID_ARGUMENT リクエストのパラメータに無効な値があることを示します。エラー レスポンスのメッセージ フィールドで、無効であった値を特定する情報が提供されます。 問題を解決してから再試行します。
NOT_FOUND リクエストが存在しないエンティティを更新しようとしていることを示します。 問題を解決してから再試行します。
PERMISSION_DENIED ユーザーがリクエストの実行を承認されなかったことを示します。 問題を解決してから再試行します。
RESOURCE_EXHAUSTED プロジェクトが割り当てを超えているか、リージョンまたはマルチリージョンの容量を超えていることを示しています。 プロジェクトの割り当てを超えていないことを確認します。プロジェクトの割り当てを超えている場合は、問題を解決せずに再試行しないでください。

そうでない場合は、指数バックオフで再試行します。
UNAUTHENTICATED リクエストに有効な認証情報がなかったことを示します。 問題を解決してから再試行します。
UNAVAILABLE サーバーがエラーを返しました。 指数バックオフを使用して再試行します。