下面给你分享关于“Nest.js参数校验和自定义返回数据格式详解”的完整攻略。
一、参数校验
在Nest.js中,我们可以使用class-validator实现参数校验。需要在controller中使用Dto来对每个请求进行参数校验。具体流程如下:
- 安装class-validator和class-transformer模块,执行如下命令:
npm install class-validator class-transformer --save
- 编写Dto。在Dto中通过
@IsXXX()
来指定验证规则。比如:
import { IsString, IsInt, IsOptional } from 'class-validator';
export class CreateCatDto {
@IsString()
readonly name: string;
@IsInt()
readonly age: number;
@IsOptional()
@IsString()
readonly breed?: string;
}
- 在控制器中使用Dto作为请求参数类型来对参数进行验证。比如:
import { Controller, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto): Promise<Cat> {
return this.catsService.create(createCatDto);
}
}
- 启用验证器。在Nest.js中,需要在main.ts中设置全局的验证管道。启用该管道后,所有的请求都会经过类验证器进行校验。比如:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
至此,参数校验功能就实现了。
二、自定义返回数据格式
在Nest.js中,我们可以使用class-transformer和class-validator模块来实现自定义返回数据格式。具体流程如下:
- 安装class-transformer和class-validator模块,执行如下命令:
npm install class-transformer class-validator --save
- 配置class-transformer。在main.ts中添加如下代码:
import { ValidationPipe } from '@nestjs/common';
import { useContainer } from 'class-validator';
import { ClassSerializerInterceptor } from '@nestjs/common';
import { NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
//2. 配置class-transformer
app.useGlobalInterceptors(new ClassSerializerInterceptor(
app.get(Reflector)
));
//3. 配置class-validator
useContainer(app.select(AppModule), {
fallbackOnErrors: true,
});
//1. 配置全局的验证管道
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
transform: true,
forbidUnknownValues: true,
transformOptions: {
excludeExtraneousValues: true,
},
}));
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
- 创建一个toJSON()方法并在其中使用class-transformer,将返回的数据转化为我们自己设定的格式。
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { Exclude, Transform } from 'class-transformer';
@Entity()
export class User {
@PrimaryGeneratedColumn()
public id: number;
@Column()
public firstName: string;
@Column()
public lastName: string;
@Transform((params) => undefined, { toPlainOnly: true })
@Exclude()
@Column()
public password: string;
public toJSON(): any {
const { id, firstName, lastName } = this;
return { id, firstName, lastName };
}
}
这里我们以User为例,删掉了password(敏感信息不应该返回给前端)。toJSON() 中自定义了返回的数据格式。
{
"id": 1,
"firstName": "John",
"lastName": "Doe"
}
这样,我们就成功地实现了自定义返回数据格式的功能。
示例:
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
async findAll(): Promise<User[]> {
return this.usersService.findAll();
}
@Get(':id')
async findOne(@Param('id') id: number): Promise<User> {
return this.usersService.findOne(id);
}
@Post()
async create(@Body() createUserDto: CreateUserDto): Promise<User> {
return this.usersService.create(createUserDto);
}
@Put(':id')
async update(@Param('id') id: number, @Body() updateUserDto: UpdateUserDto): Promise<User> {
return this.usersService.update(id, updateUserDto);
}
@Delete(':id')
async remove(@Param('id') id: number): Promise<void> {
return this.usersService.remove(id);
}
}
以上就是“Nest.js参数校验和自定义返回数据格式详解”的完整攻略啦。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nest.js参数校验和自定义返回数据格式详解 - Python技术站