Lightning データサービスでのエラーの処理

Lightning データサービス (LDS) ワイヤーアダプターは、サーバーのリソース (レコード、オブジェクトなど) にアクセスできない場合にエラーを返します。

たとえば、ワイヤーアダプターへの入力が正しくない (例: レコード ID が不正、必須項目が欠落している) 場合には、エラーが発生します。レコードがキャッシュになく、サーバーがオフラインである場合にもエラーが返されます。また、サーバー上でリソースが削除されたり、共有や表示の設定が更新されたりすることで、そのリソースにアクセスできなくなる場合もあります。

LWC エラー処理のベストプラクティス

LDS ワイヤーアダプターを使用する場合、Promise に似た非同期 JavaScript を操作することになります。通常、エラーを処理するには、try-catch ブロックを使用します。ただし、try-catch ブロックでは非同期コードの例外のみを処理できます。そのため、try-catch ブロックでキャッチされるのは 1 つのトランザクション内のエラーのみになります。

次の非同期コードを考えます。

このコードでは、1 つのトランザクションで first を出力して setTimeOut() を実行し、third を出力します。コールバック関数は、タイムアウト遅延で指定されたとおりに 1 秒後にコールされます。ただし、second は最初のトランザクションに含まれていないため、出力されません。

非同期コードのエラーが try-catch ブロックで正しく処理されるようにするには、try-catch ブロックをコールバック関数内で使用します。

このコードでは、1 つのトランザクションで first を出力して setTimeOut() を実行し、third を出力します。1 秒後にコールバックがコールされると、try-catch ブロックでエラーが処理されて、error が正しく出力されます。

@wire デコレーターを指定して、ワイヤーサービスへのコールアウトを行うと、ワイヤーサービスがワイヤーアダプターをコールして、データをフェッチします。ワイヤーアダプターは、Salesforce サーバーまたは LDS キャッシュ (使用可能な場合) からデータをフェッチします。その後、ワイヤーアダプターはデータをサービスに返し、サービスはデータをコンポーネントにプロビジョニングします。

ここで「リクエスト」や「フェッチ」ではなく「プロビジョニング」という言葉を使っているのは、データがクライアントのキャッシュに存在する場合にはネットワークリクエストが関与しないためです。

値のプロビジョニング中またはプロビジョニング後に応答でエラーがスローされる可能性があります。たとえば、ワイヤーアダプターが Apex メソッドからデータをフェッチしようとすると、Apex メソッドは例外をスローします。この例外は、必須パラメーターを解析しなかった場合やキャッシュからのフェッチに問題があった場合など、数多くの原因で発生する可能性があります。

値のプロビジョニングに成功しても、コンポーネントで応答を処理しているときにエラーが発生する可能性もあります。

lwc-recipes リポジトリには、ワイヤーサービスの例が多数含まれています。lds* で始まるコンポーネント (ldsCreateRecord など) や、apex* 始まるコンポーネント (apexImperativeMethod など) を探します。

メソッドを関数またはプロパティに結び付ける場合、error プロパティで値のプロビジョニング中のエラーが保存されます。エラーを処理するための else if ブロックをワイヤー関数に含めることをお勧めします。次のように、エラー処理を備えた関数にメソッドを結び付けます。

代わりにメソッドをプロパティに結び付ける場合、yourPropertyName.error 値をチェックしてエラーを処理できます。

data および error プロパティは API のハードコードされた値であるため、これらのプロパティを使用する必要があります。「ワイヤーサービスの構文」を参照してください。

FetchResponse エラーオブジェクトは、取得 API の応答オブジェクトの後にモデリングされます。これには、レスポンスボディ、状況コード、メッセージが含まれます。

オブジェクトの不正な recordId が指定された場合のエラー応答の例を次に示します。

エラー応答には、次のプロパティが含まれます。

  • body (オブジェクトまたは配列) — 基になる API により定義されたレスポンスボディ。
  • ok (Boolean) — 応答が成功であったかどうかを示します。エラーの場合、ok は常に false で、状況コードは 400 ~ 599 の範囲内となります。
  • status (数字) — 応答の状況コードが含まれます。たとえば、リソースが見つからない場合は 404、内部サーバーエラーでは 500 が含まれます。
  • statusText (文字列) — 状況コードに対応する状況メッセージが含まれます。たとえば、状況コード 404 では NOT_FOUND が含まれます。

getRecord ワイヤーアダプターから返されたエラーを処理するには、HTML テンプレートでエラーを表示するか、JavaScript のみで処理します。この例では、エラーがユーザーに表示されます。

JavaScript コードは、エラー本体が配列またはオブジェクトであるかどうかを確認して、エラーメッセージを返します。

lwc-recipes リポジトリには、1 つ以上の LDS エラーをエラーメッセージの文字列配列に変換する ldsUtils の例が含まれています。

エラーのレスポンスボディは、そのエラーを返す API によって異なります。

  • getRecord ワイヤーアダプターなどの UI API 読み取り操作では、error.body はオブジェクトの配列として返されます。
  • createRecord ワイヤーアダプターなどの UI API 書き込み操作では、error.body はオブジェクトとして返され、多くの場合、オブジェクトレベルおよび項目レベルのエラーを伴います。
  • Apex の読み取りおよび書き込み操作では、error.body はオブジェクトとして返されます。
  • オフラインエラーなどのネットワークエラーでは、error.body はオブジェクトとして返されます。

関連トピック