我创建了一个接收
POST/ ...
请求的控制器。
其中一个参数是可选的,例如称为 contentType
。
在服务中,我检查 contentType 是否等于某些内容,并根据结果执行某些操作。
因为该参数不是强制性的,所以我想将其设置为默认值。
在这种情况下,我在 DTO 中使用了 @Transform()
装饰器。
当我进行调用时,我看不到我在服务中的装饰器中定义的默认值。
预期:
排序 = {日期:-1}
内容类型 = 'json'
服务结果:
排序=未定义
内容类型 = 未定义
我的 NestJS 配置:
使用nestJS V10
反射元数据版本:^0.2.2"
const app = await NestFactory.create(AppModule);
...
app.useGlobalPipes(
new ValidationPipe({
transform: true,
transformOptions: { enableImplicitConversion: true },
whitelist: true,
}),
);
export class ListDto {
... more...
@IsObject()
@IsOptional()
@Transform(({ value }) => value ?? { date: -1 })
sort?: Record<string, SortOrder>; // Types Defined above I just don't want to pollute the example.
@IsString()
@IsOptional()
@IsIn(['json', 'xlsx', 'csv'], {
message: 'contentType must be one of: json, xlsx, csv',
})
@Transform(({ value }) => value ?? 'json')
contentType?: Extension;
}
@Post('list')
async list(@Body() list: ListDto): Promise<any> {
try {
console.log(list.sort) // <-- Expected default value defined in decorator, but undefined
console.log(list.contentType) // <-- Expected default value defined in decorator, but undefined
return await this.someService.list(list);
} catch (error) {
....
}
}
{
"param1" : "Some value",
"param2" : "Some other"
//NOT Passing sort or contentType
}
async list({
...more...
sort,
contentType,
}: ListeDto): Promise<List> {
console.log(contentType) <-- Expect to see the default value from the decorator, but undefined
console.log(sort) <-- Expect to see the default value from the decorator, but undefined
...some implementation...
}
我哪里做错了? 或者我错过了什么?
尝试用 OR
??
替换 ||
Nullish 运算符,并像这样设置 prop 的默认值。
export class ListDto {
... more...
@Transform(({ value }) => value || 'json')
contentType?: Extension = 'json';
}