我正在尝试验证一组ID,为了进行验证,我在nestjs项目中使用了自定义验证器。我正在将回调函数中的id数组传递给我的服务类,以从数据库查询表中是否存在id并返回布尔值。每次我传递布尔布尔值true,即使我传递了错误的ID。
这是自定义验证器中的验证功能
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, registerDecorator, ValidationOptions } from "class-validator";
import { DeviceService } from "../device/device.service";
import { Injectable } from "@nestjs/common";
@ValidatorConstraint({ async: true })
@Injectable()
export class DevicesArrayValidatorConstraint implements ValidatorConstraintInterface {
constructor(private deviceService: DeviceService) { }
async validate(devices: Array<number>, args: ValidationArguments) {
let result = devices.every(async (deviceId) => await this.deviceService.validateDevice(deviceId));
if(result){
return true;
}
else{
return false;
}
}
defaultMessage(args: ValidationArguments) { // here you can provide default error message if validation failed
return "Here is an error";
}
}
export function ValidDevices(validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: DevicesArrayValidatorConstraint
});
};
}
它来自服务类的功能
async validateDevice(deviceId: number) {
try {
let result = await this.deviceRepository.findOneOrFail(deviceId)
if(result){
console.log(`In try block,This is id ${ deviceId}`)
}
} catch (error) {
return false;
}
return true;
}
如果我传递的数组devices: [1,4]
,其中1有效,4无效。如果console.log()
返回值,我得到的是布尔值的两倍。
附加控制台消息
every
不了解异步功能。它只是看到作为真实价值返回的承诺。
您有两种选择:
如果要并行验证所有设备,请检查结果:
const validityFlags = await Promise.all(devices.map(deviceId => this.deviceService.validateDevice(deviceId)));
let result = validityFlags.every(Boolean);
或者,如果您要验证系列中的每台设备,如果知道较早的设备无效,则不要打扰以后的设备:
let result = true;
for (const deviceId of devices) {
const valid = await this.deviceService.validateDevice(deviceId);
if (!valid) {
result = false;
break;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句