エラーハンドリング
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
プロシージャ内でエラーが発生すると、tRPCはクライアントに「error」プロパティを含むオブジェクトを返します。このプロパティにはクライアント側でエラーを処理するために必要な情報が全て含まれています。
不正なリクエスト入力によって発生したエラーレスポンスの例を以下に示します:
json{"id": null,"error": {"message": "\"password\" must be at least 4 characters","code": -32600,"data": {"code": "BAD_REQUEST","httpStatus": 400,"stack": "...","path": "user.changepassword"}}}
json{"id": null,"error": {"message": "\"password\" must be at least 4 characters","code": -32600,"data": {"code": "BAD_REQUEST","httpStatus": 400,"stack": "...","path": "user.changepassword"}}}
エラーコード
tRPCでは、異なる種類のエラーと対応するHTTPステータスコードを表すエラーコードのリストが定義されています。
| Code | Description | HTTP code |
|---|---|---|
| BAD_REQUEST | The server cannot or will not process the request due to something that is perceived to be a client error. | 400 |
| UNAUTHORIZED | The client request has not been completed because it lacks valid authentication credentials for the requested resource. | 401 |
| FORBIDDEN | The server was unauthorized to access a required data source, such as a REST API. | 403 |
| NOT_FOUND | The server cannot find the requested resource. | 404 |
| TIMEOUT | The server would like to shut down this unused connection. | 408 |
| CONFLICT | The server request resource conflict with the current state of the target resource. | 409 |
| PRECONDITION_FAILED | Access to the target resource has been denied. | 412 |
| PAYLOAD_TOO_LARGE | Request entity is larger than limits defined by server. | 413 |
| METHOD_NOT_SUPPORTED | The server knows the request method, but the target resource doesn't support this method. | 405 |
| CLIENT_CLOSED_REQUEST | Access to the resource has been denied. | 499 |
| INTERNAL_SERVER_ERROR | An unspecified error occurred. | 500 |
エラーのスロー
tRPCはプロシージャ内部で発生したエラーを表現するためのエラーサブクラスTRPCErrorを提供しています。
例えば、次のエラーをスローした場合:
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router().query('hello', {resolve: () => {throw new trpc.TRPCError({code: 'INTERNAL_SERVER_ERROR',message: 'An unexpected error occurred, please try again later.',// optional: pass the original error to retain stack tracecause: theError,});},});// [...]
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router().query('hello', {resolve: () => {throw new trpc.TRPCError({code: 'INTERNAL_SERVER_ERROR',message: 'An unexpected error occurred, please try again later.',// optional: pass the original error to retain stack tracecause: theError,});},});// [...]
以下のレスポンスが生成されます:
json{"id": null,"error": {"message": "An unexpected error occurred, please try again later.","code": -32603,"data": {"code": "INTERNAL_SERVER_ERROR","httpStatus": 500,"stack": "...","path": "hello"}}}
json{"id": null,"error": {"message": "An unexpected error occurred, please try again later.","code": -32603,"data": {"code": "INTERNAL_SERVER_ERROR","httpStatus": 500,"stack": "...","path": "hello"}}}
エラーの処理
プロシージャ内で発生するすべてのエラーは、クライアントに送信される前にonErrorメソッドを通過します。ここでエラーを処理したり変更したりできます。
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// ...onError({ error, type, path, input, ctx, req }) {console.error('Error:', error);if (error.code === 'INTERNAL_SERVER_ERROR') {// send to bug reporting}},});
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// ...onError({ error, type, path, input, ctx, req }) {console.error('Error:', error);if (error.code === 'INTERNAL_SERVER_ERROR') {// send to bug reporting}},});
onErrorパラメータは、エラーとその発生コンテキストに関するすべての情報を含むオブジェクトです:
ts{error: TRPCError; // the original errortype: 'query' | 'mutation' | 'subscription' | 'unknown';path: string | undefined; // path of the procedure that was triggeredinput: unknown;ctx: Context | undefined;req: BaseRequest; // request object}
ts{error: TRPCError; // the original errortype: 'query' | 'mutation' | 'subscription' | 'unknown';path: string | undefined; // path of the procedure that was triggeredinput: unknown;ctx: Context | undefined;req: BaseRequest; // request object}