エラー処理
プロシージャでエラーが発生すると、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コードで応答するエラーコードのリストを定義しています。
コード | 説明 | HTTPコード |
---|---|---|
BAD_REQUEST | クライアントエラーと見なされる何らかの理由により、サーバーはリクエストを処理できません。 | 400 |
UNAUTHORIZED | 要求されたリソースに対して有効な認証資格情報がないため、クライアントのリクエストが完了しませんでした。 | 401 |
FORBIDDEN | サーバーは、REST APIなど、必要なデータソースへのアクセスが許可されていませんでした。 | 403 |
NOT_FOUND | サーバーは要求されたリソースを見つけることができません。 | 404 |
TIMEOUT | サーバーは、この未使用の接続をシャットダウンしたいと考えています。 | 408 |
CONFLICT | サーバーのリクエストリソースが、ターゲットリソースの現在の状態と競合しています。 | 409 |
PRECONDITION_FAILED | ターゲットリソースへのアクセスが拒否されました。 | 412 |
PAYLOAD_TOO_LARGE | リクエストエンティティが、サーバーによって定義された制限を超えています。 | 413 |
METHOD_NOT_SUPPORTED | サーバーはリクエストメソッドを知っていますが、ターゲットリソースはこのメソッドをサポートしていません。 | 405 |
UNPROCESSABLE_CONTENT | サーバーはリクエストメソッドを理解しており、リクエストエンティティも正しいのですが、処理できませんでした。 | 422 |
TOO_MANY_REQUESTS | レート制限を超過したか、サーバーに送信されているリクエストが多すぎます。 | 429 |
CLIENT_CLOSED_REQUEST | リソースへのアクセスが拒否されました。 | 499 |
INTERNAL_SERVER_ERROR | 指定されていないエラーが発生しました。 | 500 |
tRPCは、エラーからHTTPコードを抽出するのに役立つヘルパー関数 `getHTTPStatusCodeFromError` を公開しています。
ts
import {getHTTPStatusCodeFromError } from '@trpc/server/http';// Example error you might get if your input validation failsconsterror :TRPCError = {name : 'TRPCError',code : 'BAD_REQUEST',message : '"password" must be at least 4 characters',};if (error instanceofTRPCError ) {consthttpCode =getHTTPStatusCodeFromError (error );console .log (httpCode ); // 400}
ts
import {getHTTPStatusCodeFromError } from '@trpc/server/http';// Example error you might get if your input validation failsconsterror :TRPCError = {name : 'TRPCError',code : 'BAD_REQUEST',message : '"password" must be at least 4 characters',};if (error instanceofTRPCError ) {consthttpCode =getHTTPStatusCodeFromError (error );console .log (httpCode ); // 400}
ヒント
これをNext.js APIエンドポイントで使用する方法の完全な例は、サーバーサイドコールドキュメントにあります。
エラーの発生
tRPCは、プロシージャ内で発生したエラーを表すために使用できるエラーサブクラス `TRPCError` を提供しています。
たとえば、このエラーを発生させると
server.tsts
import { initTRPC, TRPCError } from '@trpc/server';const t = initTRPC.create();const appRouter = t.router({hello: t.procedure.query(() => {throw new 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.tsts
import { initTRPC, TRPCError } from '@trpc/server';const t = initTRPC.create();const appRouter = t.router({hello: t.procedure.query(() => {throw new 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].tsts
export default trpcNext.createNextApiHandler({// ...onError(opts) {const { error, type, path, input, ctx, req } = opts;console.error('Error:', error);if (error.code === 'INTERNAL_SERVER_ERROR') {// send to bug reporting}},});
pages/api/trpc/[trpc].tsts
export default trpcNext.createNextApiHandler({// ...onError(opts) {const { error, type, path, input, ctx, req } = opts;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}