欠落フィールドの処理
フィールドがリクエストに存在しない場合(値が undefined または null)、Express-Cargo は何をすべきかを知る必要があります。この動作は 2 つのデコレータで制御します。
@Default(value)— フォールバック値を割り当てます。@Optional()— 「required」エラーを発生させずに、フィールドを空のままにできます。
どちらもフィールドが欠落したときの動作という同じことを決めるため、相互に排他的です。両方を同じフィールドに適用すると、スキーマエラーが発生します。
フィールドにどちらのデコレータもなく値が欠落している場合、バインドは <field> is required バリデーションエラーで失敗します。
@Default(value: T)
@Default デコレータは、リクエストがフィールドを提供しない場合にクラスプロパティにデフォルト値を割り当てます。
value: フィールドがリクエストに存在しない場合に割り当てるデフォルト値。
class Request {
@Body()
@Default(1)
price!: number;
}
デフォルト値が適用されるタイミング
デフォルト値は、受信した値が undefined または null の場合にのみ適用されます(つまり、フィールドがリクエストに存在しない場合)。リクエストから来たその他の値はそのまま保持されます。
つまり、0、''、false のような falsy な値は実際の入力として扱われ、デフォルト値をトリガーしません。
class Request {
@Body()
@Default(10)
quantity!: number
}
受信した quantity | バインドされる値 |
|---|---|
欠落 / undefined | 10(デフォルト適用) |
null | 10(デフォルト適用) |
0 | 0(保持) |
5 | 5(保持) |
@Optional()
@Optional デコレータはフィールドをオプションとしてマークし、「required」エラーを発生させずに省略または undefined/null に設定できるようにします。フィールドが欠落している場合は null のままになり、そのフィールドのバリデーションルールはスキップされます。
class Request {
@Body()
@Min(0)
@Optional()
discount?: number
}
ここでは、欠落した discount は null にバインドされ、@Min(0) ルールはスキップされます。discount が提供された場合は、通常どおり検証されます。
@Default と @Optional の選択
| フィールド欠落 | フィールド提供 | |
|---|---|---|
@Default(value) | value にバインド | 値を保持して検証 |
@Optional() | null にバインド | 値を保持して検証 |
| どちらもなし | <field> is required エラー | 値を保持して検証 |
フィールドごとに1 つの戦略を選んでください。
class Request {
// ❌ 無効: フィールドは 1 つの欠落値戦略のみ使用できます
@Body()
@Default(1)
@Optional()
price!: number
}