如何在NestJS中添加DTO



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

当我在UserService中添加CreateUserDTO时,我得到以下TS错误。

src/user/user.service。ts:11:40 -错误TS2345:类型为"CreateUserDTO"的参数不能分配给类型为"User"的参数。类型"CreateUserDTO"缺少类型"User"的以下属性:$add, $set, $get, $count和32个以上。

我查了很多关于DTO的代码,但是我不知道为什么。

下面是代码

import { Column, Model, PrimaryKey, Table } from 'sequelize-typescript';
@Table
export class User extends Model<User> {
@PrimaryKey
@Column
userId: string;
@Column
name: string;
}
export class CreateUserDTO {
userId: string;
name: string;
}
@Injectable()
export class UserService {
constructor(@InjectModel(User) private userModel: typeof User) {}
async createUser(userData: CreateUserDTO) {
const user = await this.userModel.create<User>(userData);
}
}

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

dto是非常简单和容易使用的,你只需要定义一个类并使用它作为你的值类型导入它,而不是注入它

下面是一个使用DTO创建用户的示例create-user.dto.ts
export class CreateUserDto {
firstName: string;
lastName: string;
email: string;
password: string;
}

这里是你可以使用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);
}
}

之后,您只需要使用存储库保存对象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 });
}
}

如果您有更多问题,请阅读关于请求有效载荷的文档在NestJS

你应该把你的DTO转换成你的模型类型,不要那样做,只处理模型。

查看我的api与nestjs, https://github.com/Malagutte/lottery-domain-api/blob/main/src/game/game.service.ts#L83

最新更新