什么是为模型创建静态和实例函数的Nest.js方法?

时间:2018-01-29 09:23:15

标签: node.js mongodb nestjs

是否存在这样的事情,或者我是否遵循标准的Mongoose程序?

我阅读了文档,昨天我花了整整一天的时间,但我只能找到将函数放在服务组件中的相关文档。如果我想在服务组件之外使用静态模型函数(例如,自定义装饰器),这是无效的,因为DI是私有的,所以它不会达到它。

我会在Github上创建一个文件请求的问题,但我担心我可能忽略了一些东西。

编辑2:请不要更改帖子的标题。 “Nest”是“最佳”的拼写错误。它指的是一个名为Nest.js的Node.js框架。 (参见帖子标签和参考文献链接)

修改:在文档的MongoDB section中,有一段代码:

Model<Cat>

但具体而言,此Cat部分从扩展Mongoose Document接口的接口导入Cat。如果这个while接口是一个具有函数功能的类(即使在转换后),这不是更好吗?

2 个答案:

答案 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');
    }
  }
}