Express中tsoa与class-validator高级验证规则不生效问题
问题:Express中tsoa搭配class-validator无法触发高级验证规则
在Express.js中使用tsoa结合class-validator时,通过DTO定义请求体并在路由中指定类型后,仅能验证参数的数据类型和必填性,@IsEmail()、@Length()等class-validator的高级验证规则无法触发。
代码示例
DTO定义
// Dto export class RegisterUserDto { @IsEmail() email!: string }
控制器路由
// Route @Route('user') export class UserController extends Controller { @Post('/register') async createUser(@Body() body: RegisterUserDto) { return userService.registerUser(body) } }
生成的路由文件片段
const models = { "RegisterUserDto": { "dataType": "refObject", "properties": { // 此处未包含邮箱格式验证规则 "email": { "dataType": "string", "required": true }, }, "additionalProperties": false, }, }
使用的包版本
{ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "tsoa": "^6.2.1" }
解决方案
1. 配置tsoa启用class-validator集成
在项目根目录的tsoa.json配置文件中,确保开启class-validator验证支持:
{ "routes": { "entryFile": "./src/server.ts", "routesDir": "./src/routes", "validation": { "validate": true, "classValidator": true } }, "spec": { "outputDirectory": "./src/swagger" } }
若使用
tsconfig.json配置tsoa,需在compilerOptions的tsoa字段中添加对应配置。
2. 确保DTO装饰器正确导入并使用
确认DTO中已正确导入class-validator的装饰器,可自定义错误提示增强体验:
import { IsEmail } from 'class-validator'; export class RegisterUserDto { @IsEmail({}, { message: '邮箱格式不正确' }) email!: string; }
3. 重新生成tsoa路由
执行路由生成命令,让配置和DTO的修改生效:
tsoa routes
重新生成后,路由文件会自动集成class-validator的高级验证规则。
4. 确认Express挂载逻辑正确
确保在Express中正确挂载tsoa生成的路由,且已配置JSON解析中间件:
import { RegisterRoutes } from './routes/routes'; import express from 'express'; const app = express(); app.use(express.json()); RegisterRoutes(app); app.listen(3000, () => { console.log('Server running on port 3000'); });
内容的提问来源于stack exchange,提问作者Dharmik soni
相关产品推荐
相关产品推荐

