如何解决如何用基于接口的值填充猫鼬实体?
我正在使用NestJS API,并且试图用猫鼬创建一些文档,但是遇到了一些问题。我遵循NestJS Mongo Docs和Auth0 API Guide来掌握您应该做的事情。
[注意]我删除了代码块上所有明显且超出范围的导入。我还注册了应有的模型,所以也没什么好问的。我也可以必要填写自己的值,因为在实际产品中,我必须进行计算以填写这些值。这就是为什么我决定先填写值,而不是仅将DTO传递给猫鼬实体的原因。
这是我的猫鼬文档实体:
// src/user/interfaces/user.interface.ts
import { Document } from 'mongoose';
export interface User extends Document {
readonly string firstName;
readonly string lastName;
readonly string fullName;
}
但是..当我尝试像这样填充服务中的值时:
// src/user/user.service.ts
import { User } from './interfaces/user.interface';
@Injectable();
export class UserService {
constructor(
@InjectModel("User")
private readonly userModel: Model<User>,) {}
async createUser(dto: CreateUserDTO): Promise<User> {
const user: User = {
firstName: dto.firstName,lastName: dto.lastName,fullName: `${dto.firstName} ${dto.lastName}`,}
return await this.userModel.create(user);
}
}
它会导致以下错误,并且无法编译:
Type '{ firstName: string; lastName: string; fullName: string; }'
is missing the following properties from type 'User': increment,model,$isDeleted,remove,and 52 more.ts(2740)
这些当然是错误的,因为它扩展了Mongoose文档,并且这些值未填充。
我已经尝试了以下方法,但对“解决方案”不满意
尝试1
直接将其作为参数传递,不幸的是,这并没有给我自动完成功能和验证功能
async createUser(dto: CreateUserDTO): Promise<User> {
const newUser = new this.userModel({
firstName: dto.firstName,});
return await newUser.save();
}
尝试2
创建第二个接口,并在填充中使用接口A,在返回和调用中使用接口B
// src/user/interfaces/user.interface.ts
import { Document } from 'mongoose';
export interface User {
readonly string firstName;
readonly string lastName;
readonly string fullName;
}
export interface UserDoc extends User,Document {}
,然后在类似这样的服务中使用它:
// src/user/user.service.ts
import { User,UserDoc } from './interfaces/user.interface';
@Injectable();
export class UserService {
constructor(
@InjectModel("User")
private readonly userModel: Model<UserDoc>,) {}
async createUser(dto: CreateUserDTO): Promise<UserDoc> {
const user: User = {
firstName: dto.firstName,}
return await this.userModel.create(user);
}
}
现在,这可行,但是它确实很丑陋,您还必须确保在正确的时间使用正确的界面,因此非常不便。
TL; DR;有没有一种拥有强类型猫鼬实体的方法,您可以在其中放置将自动完成的值,例如Attempt B
中的值,但更好且更干净?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。