- 创建项目
- Nest 控制器
- nest 配置路由请求数据
- Nest 服务
- Nest 模块
- 配置静态资源
- 配置模板引擎
- Cookie 的使用
- Session 的使用
- 跨域,前缀路径、网站安全、请求限速
- 管道、守卫、拦截器、过滤器、中间件
- 一例看懂中间件、守卫、管道、异常过滤器、拦截器
- 数据验证
- 配置抽离
- 环境配置
- 文件上传与下载
- 实现图片随机验证码
- 邮件服务
- nest 基于 possport + jwt 做登陆验证
- 对数据库的密码加密:md5 和 bcryptjs
- 角色权限
- 定时任务
- 接入 Swagger 接口文档
- nest 连接 Mongodb
- typeORM 操作 Mysql 数据库
- nest 统一处理数据库操作的查询结果
- 数据库实体设计与操作
- typeorm 增删改查操作
- typeorm 使用事务的 3 种方式
- typeorm 一对一关系设计与增删改查
- typeorm 一对多和多对一关系设计与增删改查
- typeorm 多对多关系设计与增删改查
- nest 连接 Redis
- 集成 redis 实现单点登录
- Q:nestJS 注入其他依赖时为什么还需要导入其 module
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
数据验证
如何 限制 和 验证 前端传递过来的数据?
常用: dto
(data transfer object 数据传输对象) + class-validator
,自定义提示内容,还能集成 swagger
class-validator 的验证项装饰器
https://github.com/typestack/class-validator
@IsOptional() //可选的 @IsNotEmpty({ message: ‘不能为空’ }) @MinLength(6, {message: ‘密码长度不能小于 6 位’}) @MaxLength(20, {message: ‘密码长度不能超过 20 位’})
@IsEmail({}, { message: ‘邮箱格式错误’ }) //邮箱 @IsMobilePhone(‘zh-CN’, {}, { message: ‘手机号码格式错误’ }) //手机号码 @IsEnum([0, 1], {message: ‘只能传入数字 0 或 1’}) //枚举
@ValidateIf(o => o.username === ‘admin’) //条件判断,条件满足才验证,如:这里是传入的 username 是 admin 才验证
yarn add class-validator class-transformer
全局使用内置管道 ValidationPipe
,不然会报错,无法起作用
import { NestFactory } from '@nestjs/core'; import { Logger, ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe()); //全局内置管道 await app.listen(3000); } bootstrap();
编写 dto
,使用 class-validator
的校验项验证
创建 DTO:只需要用户名,密码即可,两种都不能为空
可以使用 nest g res user
一键创建带有 dto 的接口模块
import { IsNotEmpty, MinLength, MaxLength } from 'class-validator'; export class CreateUserDto { @IsNotEmpty({ message: '用户名不能为空' }) username: string; @IsNotEmpty({ message: '密码不能为空' }) @MinLength(6, { message: '密码长度不能小于 6 位', }) @MaxLength(20, { message: '密码长度不能超过 20 位', }) password: string; }
修改 DTO:用户名,密码,手机号码,邮箱,性别,状态,都是可选的
import { IsEnum, MinLength, MaxLength, IsOptional, IsEmail, IsMobilePhone, } from 'class-validator'; import { Type } from 'class-transformer'; export class UpdateUserDto { @IsOptional() username: string; @IsOptional() @MinLength(6, { message: '密码长度不能小于 6 位', }) @MaxLength(20, { message: '密码长度不能超过 20 位', }) password: string; @IsOptional() @IsEmail({}, { message: '邮箱格式错误' }) email: string; @IsOptional() @IsMobilePhone('zh-CN', {}, { message: '手机号码格式错误' }) mobile: string; @IsOptional() @IsEnum(['male', 'female'], { message: 'gender 只能传入字符串 male 或 female', }) gender: string; @IsOptional() @IsEnum({ 禁用: 0, 可用: 1 },{ message: 'status 只能传入数字 0 或 1', }) @Type(() => Number) //如果传递的是 string 类型,不报错,自动转成 number 类型 status: number; }
controller
和 service
一起使用
// user.controller.ts import { Controller, Post, Body, HttpCode, HttpStatus, } from '@nestjs/common'; import { UserService } from './user.service'; import { CreateUserDto } from './dto/create-user.dto'; @Controller('user') export class UserController { constructor(private readonly userService: UserService) { } @Post() @HttpCode(HttpStatus.OK) async create(@Body() user: CreateUserDto) { //使用创建 dto return await this.userService.create(user); } @Patch(':id') async update(@Param('id') id: string, @Body() user: UpdateUserDto) { //使用更新 dto return await this.userService.update(id, user); } }
// user.service.ts import { Injectable } from '@nestjs/common'; import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { UsersEntity } from './entities/user.entity'; import { ToolsService } from '../../utils/tools.service'; import { CreateUserDto } from './dto/create-user.dto'; @Injectable() export class UserService { constructor( @InjectRepository(UsersEntity) private readonly usersRepository: Repository<UsersEntity>, ) { } async create(user: CreateUserDto) { //使用 dto do some thing.... } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论