1 nestjs
我有教程|中的以下代码:
constructor(@InjectModel('User') private readonly userModel: Model<User>) {}
Run Code Online (Sandbox Code Playgroud)
哪里User:
export interface User extends Document {
readonly name: string;
readonly age: number;
readonly phone: string;
}
Run Code Online (Sandbox Code Playgroud)
您能解释一下我们是如何@InjectModel运作的,是什么'User'以及为什么我们通过了Model<User>,这意味着什么?
我还可以使用什么注射@InjectModel?
好吧,要讨论这个问题,首先我们必须承认接口在运行时并不存在。所以User您拥有的界面仅在开发期间有用。我将尝试一步一步地分解这个过程,从行尾开始并向后进行。
Model<User>:Model是 公开的接口类型,mongoose它允许我们知道我们正在使用的模型具有find和等方法create。通过说Model<User>我们是在说“这是一个引用接口的猫鼬模型对象User。这对于 Typescript 特别有用,因为由于函数是使用泛型键入的,所以它知道方法的返回内容是什么find:对象数组User。模型接口实际上Model<T>是T扩展的接口Document(另一种mongoose类型)。
什么是'User':'User'是相当于接口名称的字符串。如果你的扩展接口Document被称为Dog你使用'Dog',如果它是Animal你使用'Animal'。不传递接口的原因是因为接口在运行时不存在(与类不同)。
如何@InjectModel()运作:好的,这是要回答的问题中真正有趣的部分。Nest 通过使用注入令牌正常工作。通常,这些令牌由注入值的类型决定。就你而言Model<User>。现在,这里的问题是 A) 接口在运行时不存在,B) Typescript 不能很好地反映泛型,所以即使是Model一个类,所能得到的也只是Model没有足够的关于注入内容的信息。因此,Nest 采取的下一个逻辑步骤是允许用户提供注入令牌并使用@Inject()装饰器。您可以通过这种方式执行诸如注入对象之类的操作(例如包配置信息)。很有用,但如果不构建自己的提供程序,使用起来有点困难。现在介入@InjectModel()。@InjectModel()根据传递到函数中的字符串构建注入令牌。该标记与您实际传递给函数的typeModel内容类似。type这具体告诉 Nest 我们正在注入什么模型。这还需要与使用 创建的提供程序保持一致MongooseModule.forFeature(),因此为什么name以及传递给的值@InjectModel()需要保持一致。通常,当它们使用与接口相同的字符串名称时,最容易对齐。
| 归档时间: |
|
| 查看次数: |
2870 次 |
| 最近记录: |