plainToInstance转换后class-validator数组验证未生效,如何解决?
问题原因及解决方法
你遇到的问题是class-validator的validate()方法默认不支持直接验证数组类型,它仅能处理单个类实例。当你传入数组时,它无法识别数组中的每个Foo实例并执行验证逻辑,因此返回空错误数组。
解决步骤
方法1:遍历数组逐个验证
手动遍历转换后的data数组,对每个Foo实例调用validate(),再合并所有错误结果:
import { plainToInstance } from 'class-transformer'; import { IsEmail, validate } from 'class-validator'; class Foo { @IsEmail() email: string; } (async () => { const data = plainToInstance(Foo, [{ email: '' }, { email: '1@' }, { email: 'bar@domain.com'}]); // 遍历数组对每个实例单独验证 const errorsList = await Promise.all(data.map(item => validate(item))); // 扁平化错误数组 const errors = errorsList.flat(); console.info(errors); // 会输出前两个实例的邮箱格式错误 })();
方法2:使用validateOrReject(推荐)
如果希望在验证失败时直接抛出异常,可结合Promise.all使用validateOrReject:
import { plainToInstance } from 'class-transformer'; import { IsEmail, validateOrReject } from 'class-validator'; class Foo { @IsEmail() email: string; } (async () => { const data = plainToInstance(Foo, [{ email: '' }, { email: '1@' }, { email: 'bar@domain.com'}]); try { await Promise.all(data.map(item => validateOrReject(item))); console.log('所有实例验证通过'); } catch (errors) { console.info('验证错误:', errors); } })();
补充说明
你单独验证new Foo()时能得到错误,是因为此时传入的是单个类实例,validate()可以正确识别并应用装饰器的验证规则。
内容的提问来源于stack exchange,提问作者Getting There
相关产品推荐
相关产品推荐

