本文へスキップ

エラーハンドリング

バリデーションが失敗すると、bindingCargoCargoValidationError をスローします。setCargoErrorHandler または Express の標準エラーハンドリングミドルウェアを使用してこのエラーを処理できます。


エラーの種類

CargoValidationError

1つ以上のフィールドがバリデーションに失敗した場合にスローされます。

プロパティ説明
namestring常に 'CargoValidationError'
errorsCargoFieldError[]フィールドごとのエラー一覧

CargoFieldError

単一フィールドのバリデーション失敗を表します。

プロパティ説明
namestring常に 'CargoFieldError'
fieldstring | symbol失敗したフィールド名
messagestringエラーメッセージ

方法 1: setCargoErrorHandler(推奨)

アプリ起動時に一度登録するだけで、すべてのルートのバリデーションエラーを自動的に処理します。

import { setCargoErrorHandler, CargoValidationError } from 'express-cargo'

setCargoErrorHandler((err, req, res, next) => {
res.status(400).json({
error: 'バリデーション失敗',
details: err.errors.map(e => ({
field: e.field,
message: e.message,
})),
})
})

レスポンス例:

{
"error": "バリデーション失敗",
"details": [
{ "field": "email", "message": "email should be a valid email" },
{ "field": "age", "message": "age must be >= 0" }
]
}

方法 2: Express エラーミドルウェア

Express の 4 引数エラーミドルウェアを使用して CargoValidationError を処理します。

import { CargoValidationError } from 'express-cargo'
import { Request, Response, NextFunction } from 'express'

app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
if (err instanceof CargoValidationError) {
return res.status(400).json({
error: 'バリデーション失敗',
details: err.errors.map(e => ({
field: e.field,
message: e.message,
})),
})
}
next(err)
})

注意: setCargoErrorHandler が登録されている場合は優先して実行されます。Express エラーミドルウェアがエラーを受け取るのは、setCargoErrorHandler 内で next(err) が呼び出された場合のみです。


複数エラーの処理

1つのリクエストで複数のバリデーションが同時に失敗することがあります。すべてのエラーは収集され、まとめて返されます。

class CreateUserDto {
@Body()
@Email()
email!: string

@Body()
@Min(0)
age!: number
}

両方のフィールドが無効な場合、err.errors には2つのエントリが含まれます:

{
"error": "バリデーション失敗",
"details": [
{ "field": "email", "message": "email should be a valid email" },
{ "field": "age", "message": "age must be >= 0" }
]
}