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

哈里姆·雷汉

我正在尝试验证一组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()返回值,我得到的是布尔值的两倍

附加控制台消息 在此处输入图片说明

TJ人群

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

logrotate无法旋转日志,并得到“无此类文件错误”

我尝试在 html 中使用 python 并得到这个错误

尝试使用Selenium从Web下载数据并得到奇怪的错误

我使用nullif并得到sql除以零错误

Python - 比较两个列表并得到不正确的结果

React - 将正确的数据发送到服务器并得到错误

使用@ azure / identity访问Key Vault并得到错误“请求缺少承载或PoP令牌错误401”

在小部件的嵌套部分中使用Provider并得到dispose()错误

在React中渲染列表并得到Eslint错误“没有未使用的表达式”

在 DataFrame 中使用 IF 语句并得到错误:Series 的真值不明确

使用地图功能并得到这个错误 company1.map is not a function React JS

使用math.h实现sin函数并得到错误不知道为什么

查询 INFORMATION_SCHEMA.COLUMNS 并得到错误“查询处理器耗尽内部资源,无法生成查询计划”

使用reverse_iterator而不是const_reverse_iterator并得到讨厌的编译器警告和错误

我需要使用 min 显示一个范围内的素数。1 while & for 循环。并得到错误的输出

尝试使用Nginx在我的CentOS 7 VPS上安装phpBB(3.2.7),并得到403、502错误或默认页面

我在操作中使用 url 并得到 404 not found 但路由存在,当我使用路由时,我得到错误路由未在 Laravel 中定义

尝试在 R 中使用闪亮的应用程序创建未来价值计算器并得到错误:参数 1(类型“闭包”)无法由“猫”处理

使用DBeaver查询PostgreSQL数据库并得到以下错误:SQL错误[0A000]:错误:跨数据库引用未实现

如何输入公式并得到结果?

C# 初始化一个固有对象并得到错误“无法在 LINQ to Entities 查询中构造实体”

无法还原PostgreSQL数据库备份,并得到“ pg_restore:[archiver]文件头中不受支持的版本(1.13)”错误

在 WHERE 子句中使用 AND 和 OR 条件得到错误的结果

使用 PriorityQueue 实现 Dijkstra 算法时得到错误结果

使用LESS mixin多次设置变量,但得到错误的结果

PostgreSQL-使用特定查询得到错误的结果

使用 cusolverDnDpotrfBatched 得到不正确的结果

在js中使用变量进行计算时无法得到正确的结果

Python Beatifulsoup 无法正确使用 selenium 的结果