我正在使用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文档,并且这些值未填充。
我已经尝试了以下方法,但对“解决方案”不满意
直接将其作为参数传递,不幸的是,这并没有给我自动完成功能和验证功能
async createUser(dto: CreateUserDTO): Promise<User> {
const newUser = new this.userModel({
firstName: dto.firstName,
lastName: dto.lastName,
fullName: `${dto.firstName} ${dto.lastName}`,
});
return await newUser.save();
}
创建第二个接口,并在填充中使用接口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,
lastName: dto.lastName,
fullName: `${dto.firstName} ${dto.lastName}`,
}
return await this.userModel.create(user);
}
}
现在,这可行,但是它确实很丑陋,您还必须确保在正确的时间使用正确的界面,因此非常不便。
TL; DR;有没有一种拥有强类型猫鼬实体的方法,您可以在其中放置将自动完成的值,例如Attempt B
中的值,但更好且更干净?