Javascript 无法正确使用array.every()并得到错误的结果

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

我试图验证一个ID数组,为了验证,我在nestjs项目中使用了自定义验证器。我将回调函数中的id数组传递给我的服务类,以从数据库中查询表中是否存在id,并返回一个布尔值。每次我收到布尔真,即使我传递了错误的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
        });
    };
}
如果我正在传递一个
设备数组:[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;
    }
}