javascript - როგორ შემიძლია ვიყო დეკორატორი კლასში მეთოდის ვარიანტისთვის NestJS-ში?


import {isNotEmpty} from "class-validator";

export Service   {

create(createdto)
{
const {name,age} = createdto;

@isNotEmpty()
name          //using decorator to check whether name is null or 
undefined
} 
}

ამიტომ, დეკორატორი მხოლოდ კლასი მეთოდებისთვის არის სასარგებლო, მე არ შემიძლია მისი გამოყენება მეთოდის ცვლადებში. როგორ შეუძლიათ მათ მეთოდის ცვლადების ვალიდაცია?

პასუხი #1

გათვალისწინებით, რომ ლოკალურ ცვლებებზე დეკორატორები ენის (ECMAScript2016/Typescript) მიერ მხარდაჭერილი არ არის, თქვენ ვერ გამოიყენებთ დეკორატორებს თქვენს სერვისში ისე, როგორც ეს აღწერილია კითხვაში.

მიუხედავად ამისა, class-validator სთავაზობს მისი ვალიდაციის ფუნქციებისთვის დეკორატორის გარეშე განხორციელებას.

Github-ზე class-validator-ის შესახებ: https://github.com/typestack/class-validator#manual-validation წერია:

ვალიდატორში არსებობს რამდენიმე მეთოდი, რომელიც საშუალებას გაძლევთ მოახდინოთ ვალიდაცია დეკორატორის გარეშე:

import { isEmpty, isBoolean } from 'class-validator';

isEmpty(value); isBoolean(value);

ამრიგად, იგივე მიზანს შეგიძლიათ მიაღწიოთ ასეთი კოდის გამოყენებით:

import { Injectable } from "@nestjs/common";
import { CreateDto } from "./dto/create.dto";
import { isEmpty, isInt } from "class-validator";

@Injectable()
export class TestValidationService {
  test(createDto: CreateDto) {
    const {name, age} = createDto;
    
    if (isEmpty(name)) {
      throw "There is no name.";
    }
    
    if (!isInt(age)) {
      throw "Age is not int."
    }
    
    return createDto;
  }
}

ბოლოს, თუ თქვენთვის მოსახერხებელი არ არის სერვისში ერთზე ერთის მეთოდის გამოყენება, თქვენ ჯერ კიდევ შეგიძლიათ დააკონფიგურიროთ თქვენი DTO და გამოიყენოთ validate მეთოდი class-validator-დან.

როგორც ეს:

import { IsInt, IsNotEmpty } from "class-validator";

export class CreateDto {
  @IsNotEmpty()
  name: string;
  
  @IsInt()
  age: number
}

და თქვენს სამსახურში:

async testWithValidate(createDto: CreateDto) {
    const validationResult = await validate(createDto);
}