覆盖 nestjs/crud 响应

Posted

技术标签:

【中文标题】覆盖 nestjs/crud 响应【英文标题】:Override nestjs/crud response 【发布时间】:2021-12-28 14:54:15 【问题描述】:

我在这个项目中使用了 nest 和 nestjs/crud 库。不幸的是,我无法覆盖 createOneBase 函数,以便它返回人员响应 我在同一主题的最后几篇文章中寻找解决方案。 我想在创建用户时更改答案。

我有什么:

    
        "id": 12,
        "username": "test",
        "password": "tests",
        "email": "test@foo.bar"
    

我的期望:

    
        "id": 12,
        "username": "test",
        "password": "tests",
        "email": "test@foo.bar",
        "token": "TOKEN"
    

我的控制器:

import  Controller  from '@nestjs/common';
import  UsersService  from './users.service';
import  Crud, Override, ParsedRequest, ParsedBody, CrudRequest, CrudController  from '@nestjsx/crud';
import  User, UserDTO  from './user';

@Crud(
  model: 
    type: User,
  ,
)
@Controller('users')
export class UsersController 
  constructor(public service: UsersService) 

  get base(): CrudController<User | UserDTO> 
    return this;
  

  @Override()
  createOne(
    @ParsedRequest() req: CrudRequest,
    @ParsedBody() dto: User,
  ): Promise<User | UserDTO> 
    const userDto: UserDTO = 
      id: dto.id,
      username: dto.username,
      password: dto.password,
      email: dto.email,
      token: 'TOKEN',
    ;
    return this.base.createOneBase(req, userDto);
  

我的实体:

import  IsDefined, IsString, MinLength  from 'class-validator';
import  Entity, PrimaryGeneratedColumn, Column  from 'typeorm';

@Entity()
export class User 
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsDefined( always: true )
  @IsString( always: true )
  @MinLength(1,  always: true )
  username: string;

  @Column()
  @IsDefined( always: true )
  @IsString( always: true )
  @MinLength(5,  always: true )
  password: string;

  @Column()
  @IsDefined( always: true )
  @IsString( always: true )
  @MinLength(1,  always: true )
  email: string;


export class UserDTO 
  id: number;
  username: string;
  password: string;
  email: string;
  token: string;
  access_token?: string;

所以我不明白它有什么问题,谢谢你的帮助

【问题讨论】:

【参考方案1】:

要覆盖 Nestjs/Crud 方法,请使用装饰器 @Override(functionName) Nestjs/Crud Doc

 @Override('createOneBase')
 createOne(
    @ParsedRequest() req: CrudRequest,
    @ParsedBody() dto: Hero) 
 
    return this.base.createOneBase(req, dto);
 

【讨论】:

你好,谢谢你的帮助,但它没有回答我的问题,因为我已经使用了这个功能,另一方面我感兴趣的是能够修改 createOnBase 的答案 好的,3个解决方案,首先,创建一个方法来获取您的令牌或其他数据并在控制器返回之前添加它,第二个覆盖您的服务和方法createOneBase,第三个使用nestJs拦截器跨度>

以上是关于覆盖 nestjs/crud 响应的主要内容,如果未能解决你的问题,请参考以下文章

NestJS:转换响应

在 NestJS Jest 测试中覆盖提供程序

如何解决 Nestjs 中的“策略#authenticate 必须被子类覆盖”错误

Nestjs 日志响应数据对象

nestjs 中间件获取请求/响应体

如何根据 GraphQL (NestJS) 中的条件发送不同的订阅响应?