我正在尝试使用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