【问题标题】:How to validate request in typeorm controller如何在 typeorm 控制器中验证请求
【发布时间】:2022-05-11 02:40:34
【问题描述】:

我创建了一个示例应用程序来为用户保存数据。我想知道在保存和显示 JSON 响应之前如何验证它。我有一个reference link,但它没有使用控制器。

请提出使用控制器的解决方案。下面是我的代码

实体文件:

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class User { 

   @PrimaryGeneratedColumn() 
   id: number; 

   @Column() 
   firstName: string; 
 
   @Column() 
   lastName: string; 
       
   @Column() 
   age: number; 
}

控制器文件:

import {getRepository} from "typeorm"; import {NextFunction, Request, Response} from "express"; import {User} from "../entity/User"; 
    
export class UserController {
    
   private userRepository = getRepository(User); 
       
   async all(request: Request, response: Response, next: NextFunction) { 
      return this.userRepository.find(); 
   } 
       
   async one(request: Request, response: Response, next: NextFunction) { 
      return this.userRepository.findOne(request.params.id); 
   } 
       
   async save(request: Request, response: Response, next: NextFunction) { 
      return this.userRepository.save(request.body); 
   } 

   async remove(request: Request, response: Response, next: NextFunction) { 
     let userToRemove = await this.userRepository.findOne(request.params.id); 
     await this.userRepository.remove(userToRemove); 
   } 
}

我想验证 firstnamelastname 是否为强制性,即不应接受空白值,并且年龄不应仅采用空白值和数字。

【问题讨论】:

  • 可以分享代码吗?
  • 我已经用代码更新了描述,我必须使用 class-validator。请尽快回复

标签: node.js typescript typeorm class-validator


【解决方案1】:

是的,您可以在模型类中使用验证功能:

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class User { 

    @PrimaryGeneratedColumn() 
    id: number; 

    @Column() 
    firstName: string; 
     
    @Column() 
    lastName: string; 
           
    @Column() 
    age: number; 
     
    @BeforeInsert()
    @BeforeUpdate()
    async validate() {
      await validateOrReject(this);
    }

}

【讨论】:

    【解决方案2】:

    您可以使用 class-validator 和 class-transformer 包。 将 JSON 的结构定义为 typescript 类,并从 class-validator 包中添加装饰器。

    export class UserStructure { 
    
       @IsString()
       firstName: string; 
     
       @IsString()
       lastName: string; 
           
    
       age: number; 
    }
    
    

    使用类转换器将普通对象转换为 UserStructure 类,然后将类传递给从 class-validator 包导入的验证函数以执行验证

    import { plainToClass } from 'class-transformer';
    import {validate} from 'class-validator';
    
    //Place the following code inside your controller
    let userStructureClass = plainToClass(UserStructure , req.body); //convert req.body plain object to UserStructure Class
    let errors = await validate(userStructureClass);
    if(errors.length > 0) req.json(errors)
    
    

    注意:验证方法仅适用于类,这就是我们使用类转换器将 req.body 普通对象转换为类然后执行验证的原因。 这些包使用装饰器,因此请确保将以下内容放在 tsconfig.json 中

     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2019-02-25
      • 2018-03-23
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 2023-02-18
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多