如何在NestJS中添加DTO

won*_*ids 4 typescript nestjs

我正在尝试使用 制作一个简单的应用程序nestjs

当我添加时CreateUserDTOUserService我收到以下 TS 错误。

src/user/user.service.ts:11:40 - 错误 TS2345:“CreateUserDTO”类型的参数不可分配给“User”类型的参数。类型“CreateUserDTO”缺少类型“User”中的以下属性:$add、$set、$get、$count 以及其他 32 个属性。11 返回await this.userModel.create(userData);

我查了很多关于DTO的代码,但不知道原因。

这是代码。

import { Column, Model, PrimaryKey, Table } from 'sequelize-typescript';

@Table
export class User extends Model<User> {
  @PrimaryKey
  @Column
  userId: string;

  @Column
  name: string;
}
Run Code Online (Sandbox Code Playgroud)
export class CreateUserDTO {
  userId: string;
  name: string;
}
Run Code Online (Sandbox Code Playgroud)
@Injectable()
export class UserService {
  constructor(@InjectModel(User) private userModel: typeof User) {}

  async createUser(userData: CreateUserDTO) {
    const user = await this.userModel.create<User>(userData);
  }
}
Run Code Online (Sandbox Code Playgroud)

Hug*_*ohm 5

问题来自于extends Model<User>你的构造函数,你不需要扩展 User 方法或注入 DTO。

DTO 非常简单且易于使用,您只需定义一个类并将其用作值类型,导入它而不是注入它

这是使用 DTO 创建用户的示例 create-user.dto.ts

export class CreateUserDto {
  firstName: string;

  lastName: string;

  email: string;

  password: string;
}
Run Code Online (Sandbox Code Playgroud)

这是控制器,您可以在其中使用 DTO 作为类型 users.controller.ts

import { CreateUserDto } from './dto/create-user.dto';

export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  public async createUser(@Body() user: CreateUserDto) {
    await this.usersService.register(user);
  }
}
Run Code Online (Sandbox Code Playgroud)

之后,您只需使用存储库保存对象 users.service.ts

import { Injectable } from '@nestjs/common';
import { UsersEntity } from './users.entity';
import { CreateUserDto } from './dto/create-user.dto';
import { UsersRepository } from './users.repository';

@Injectable()
export class UsersService {
  constructor(private readonly usersRepository: UsersRepository) {}
  
  public async register(user: CreateUserDto): Promise<UsersEntity> {
    return this.usersRepository.save({ ...user });
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您有更多疑问,请阅读有关NestJS 上请求负载的文档