首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ValidatorConstraint中注入ValidatorConstraint使我在NestJS中没有定义

在ValidatorConstraint中注入ValidatorConstraint使我在NestJS中没有定义
EN

Stack Overflow用户
提问于 2022-07-05 17:34:52
回答 1查看 728关注 0票数 1

我希望使用自定义ValidatorConstraint来验证表中是否存在值为值的列。我想注入DataSource of TypeORM来进行查询,但是当我在验证器中生成this.dataSource时,会返回“未定义”。

这是我的DTO:

代码语言:javascript
复制
import { ApiProperty } from '@nestjs/swagger';
import { IsInt, IsNotEmpty, IsString, Max, Min } from 'class-validator';
import { Exists } from "../../common/decorators/exists.decorator";

export class CreateTeacherReviewDto {

    @ApiProperty()
    @IsNotEmpty()
    @IsInt()
    @Exists(['teacher:id'])
    readonly teacherId: number;
}

这是我的自定义验证器:

代码语言:javascript
复制
import { BadRequestException, Injectable } from '@nestjs/common';
import {
    registerDecorator,
    ValidationArguments,
    ValidationOptions,
    ValidatorConstraint,
    ValidatorConstraintInterface,
} from 'class-validator';
import { DataSource } from "typeorm";

export function Exists(property: any, validationOptions?: ValidationOptions) {
    return (object: any, propertyName: string) => {
        registerDecorator({
            target: object.constructor,
            propertyName,
            options: validationOptions,
            constraints: [property],
            validator: ExistsConstraint,
        });
    };
}

@ValidatorConstraint({ name: 'Exists', async: true })
@Injectable()
export class ExistsConstraint implements ValidatorConstraintInterface {
    constructor(protected dataSource: DataSource) {}

    async validate(value: number | string, args: ValidationArguments) {
        const { constraints } = args;
        if (constraints.length === 0) {
            throw new BadRequestException(`Failed validating ${value} exists.`);
        }

        const str = constraints[0][0].split(':');
        const tableName = str[0];
        const columnName = str[1];

        console.log(this.dataSource); // In this line returns me undefined

        return false;

    }

    defaultMessage(args: ValidationArguments) {
        const { property, value } = args;

        return `${property} ${value} is already taken.`;
    }
}

我在package.json中的依赖关系:

代码语言:javascript
复制
"dependencies": {
        "@nestjs/common": "^8.0.0",
        "@nestjs/config": "^2.1.0",
        "@nestjs/core": "^8.0.0",
        "@nestjs/jwt": "^8.0.1",
        "@nestjs/mapped-types": "*",
        "@nestjs/passport": "^8.2.2",
        "@nestjs/platform-express": "^8.0.0",
        "@nestjs/swagger": "^5.2.1",
        "@nestjs/typeorm": "^8.1.4",
        "bcrypt": "^5.0.1",
        "class-transformer": "^0.5.1",
        "class-validator": "^0.13.2",
        "mysql2": "^2.3.3",
        "passport": "^0.6.0",
        "passport-jwt": "^4.0.0",
        "reflect-metadata": "^0.1.13",
        "rimraf": "^3.0.2",
        "rxjs": "^7.2.0",
        "swagger-ui-express": "^4.4.0",
        "typeorm": "^0.3.6"
    },

还有我的tsconfig.json

代码语言:javascript
复制
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false
  }
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-25 07:05:25

将ExistsConstraint注入SharedModule中作为提供程序,它应该可以工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72873471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档