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

Not able to use array.every() correctly and getting wrong result

我正在尝试验证 ID 数组,为了验证,我在 nestjs 项目中使用了自定义验证器。我将回调函数中的 id 数组传递给我的服务 class,以从数据库查询 id 是否存在于 table 中,并且 return 是一个布尔值。每次我收到布尔值 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
        });
    };
}

它是来自服务的功能 Class

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() return 值,我会得到一个双布尔结果。

附加控制台消息

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;
    }
}