是否存在这样的事情,或者我是否遵循标准的Mongoose程序?
我阅读了文档,昨天我花了整整一天的时间,但我只能找到将函数放在服务组件中的相关文档。如果我想在服务组件之外使用静态模型函数(例如,自定义装饰器),这是无效的,因为DI是私有的,所以它不会达到它。
我会在Github上创建一个文件请求的问题,但我担心我可能忽略了一些东西。
编辑2:请不要更改帖子的标题。 “Nest”不是“最佳”的拼写错误。它指的是一个名为Nest.js的Node.js框架。 (参见帖子标签和参考文献链接)
修改:在文档的MongoDB section中,有一段代码:
Model<Cat>
但具体而言,此Cat
部分从扩展Mongoose Document
接口的接口导入Cat
。如果这个while
接口是一个具有函数功能的类(即使在转换后),这不是更好吗?
答案 0 :(得分:0)
@InjectModel()
是一个注入注册组件的帮助装饰器。您始终可以直接使用模型类,而不是通过构造函数注入它。多亏了你可以在任何地方使用模型(但我不确定自定义装饰器是否是正确的选择)。此外,Model<Cat>
在这里是多余的。您可以将此类型替换为适合您的用例的任何其他类型,例如typeof X
,如果您想调用静态函数。
答案 1 :(得分:0)
我使用以下方法:
定义架构时,将静态方法添加到Mongoose架构:
UserSchema.methods.comparePassword = async function(candidatePassword: string) {
return await bcrypt.compare(candidatePassword, this.password);
};
还将方法包含在对象的接口定义中:
export interface User {
firstName: string;
...
comparePassword(candidatePassword: string): Promise<boolean>;
}
以及UserDocument界面
export interface UserDocument extends User, Document { }
现在我的UsersService:
export class UsersService {
constructor(@InjectModel(Schemas.User) private readonly userRepository: Model<UserDocument>,
private readonly walletService: WalletsService,
@Inject(Modules.Logger) private readonly logger: Logger) {}
async findByEmail(email: string): Promise<UserDocument> {
return await this.userRepository.findOne({ email }).select('password');
}
...
}
将所有内容绑定在一起,当用户尝试登录时,Auth服务将按ID检索用户对象,并调用该用户对象的comparePassword实例方法:
@Injectable()
export class AuthService {
constructor(
private readonly usersService: UsersService,
private readonly jwtService: JwtService,
) { }
async signIn({ email, password }: SignInDto): Promise<LoginResponse> {
const user = await this.usersService.findByEmail(email);
if (!user) { throw new UnauthorizedException('Invalid Username or Password'); }
if (await user.comparePassword(password)) {
const tokenPayload: JwtPayload = { userId: user.id };
const token = this.jwtService.sign(tokenPayload);
return ({ token, userId: user.id, status: LoginStatus.success });
} else {
throw new UnauthorizedException('Invalid Username or Password');
}
}
}