NestJS,在DTO中序列化bigint参数
NestJS, serialise bigint parameters in DTO
我的 DTO 的参数类型为 bigint
。目前,当我收到这些 DTO 时,所有这些 pramates 的类型总是 string
。这是示例:
@Get("")
async foo(@Query() query: Foo) {
console.log(typeof Foo.amount) //string
}
我的 DTO:
export class Foo {
amount: bigint;
}
如何让它工作并具有 bigint
类型的 amount
在你的 DTO 中:
import { Transform } from 'class-transformer';
//...
export class Foo {
@Transform(val => BigInt(val.value))
amount: bigint;
}
也在你的控制器中:
import {ValidationPipe} from '@nestjs/common';
//...
@Get("")
async foo(@Query(new ValidationPipe({ transform: true })) query: Foo) {
console.log(typeof Foo.amount) //should be bigint
}
发生了什么:
ValidationPipe 是 NestJS 中的默认管道,它使用反射使用 Foo DTO class 中定义的规则验证查询 属性。选项 transform: true 将转换即;在 @Transform
装饰器中执行函数并将原始值替换为转换后的值(在您的情况下为 val => BigInt(val))。
这会将字符串化的“bigint”转换为原始的“bigint”。
编辑: 更新了 Transform
装饰器中的函数以匹配 class-transformer v0.4.0
我的 DTO 的参数类型为 bigint
。目前,当我收到这些 DTO 时,所有这些 pramates 的类型总是 string
。这是示例:
@Get("")
async foo(@Query() query: Foo) {
console.log(typeof Foo.amount) //string
}
我的 DTO:
export class Foo {
amount: bigint;
}
如何让它工作并具有 bigint
类型的 amount
在你的 DTO 中:
import { Transform } from 'class-transformer';
//...
export class Foo {
@Transform(val => BigInt(val.value))
amount: bigint;
}
也在你的控制器中:
import {ValidationPipe} from '@nestjs/common';
//...
@Get("")
async foo(@Query(new ValidationPipe({ transform: true })) query: Foo) {
console.log(typeof Foo.amount) //should be bigint
}
发生了什么:
ValidationPipe 是 NestJS 中的默认管道,它使用反射使用 Foo DTO class 中定义的规则验证查询 属性。选项 transform: true 将转换即;在 @Transform
装饰器中执行函数并将原始值替换为转换后的值(在您的情况下为 val => BigInt(val))。
这会将字符串化的“bigint”转换为原始的“bigint”。
编辑: 更新了 Transform
装饰器中的函数以匹配 class-transformer v0.4.0