Javascript 无法正确使用array.every()并得到错误的结果
我试图验证一个ID数组,为了验证,我在nestjs项目中使用了自定义验证器。我将回调函数中的id数组传递给我的服务类,以从数据库中查询表中是否存在id,并返回一个布尔值。每次我收到布尔真,即使我传递了错误的id 下面是自定义验证器中的验证函数Javascript 无法正确使用array.every()并得到错误的结果,javascript,express,nestjs,typeorm,class-validator,Javascript,Express,Nestjs,Typeorm,Class Validator,我试图验证一个ID数组,为了验证,我在nestjs项目中使用了自定义验证器。我将回调函数中的id数组传递给我的服务类,以从数据库中查询表中是否存在id,并返回一个布尔值。每次我收到布尔真,即使我传递了错误的id 下面是自定义验证器中的验证函数 import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, registerDecorator, ValidationOptions } from &qu
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
});
};
}
如果我正在传递一个设备数组:[1,4]
,其中1有效,4无效。如果我console.log()
返回值,我将得到一个双布尔结果
附加控制台消息
每个
都不理解异步函数。它只是看到了作为真实价值返回的承诺
您有两个选择:
如果要并行验证所有设备,请检查结果:
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;
}
}
每个
都不理解异步函数。它只看到作为真实值返回的承诺。解决方法是什么?if(result){return true;}否则{return false;}
-result
已经是一个布尔值,因此您可以简单地返回result
也这样做,但始终接收布尔值true;(哇!输入错误。如果你在上面的循环中看到for,点击刷新。它应该是for of
循环。)@Andreas-LOL,相当不错。所以有两个打字错误::-)谢谢同样的问题,如果我并行验证所有设备。如果我验证每个设备,我不能使用break,因为我需要break不允许通过的布尔值@Hareemrehan您可以使用此答案中的两个版本之一替换异步验证(…){…}
函数体,它应该可以工作。“我不能使用break,因为我需要布尔值”-因此使用了result
变量。
let result = true;
for (const deviceId of devices) {
const valid = await this.deviceService.validateDevice(deviceId);
if (!valid) {
result = false;
break;
}
}