Nestjs 模型的Nest.js注入?
我有教程|中的以下代码:Nestjs 模型的Nest.js注入?,nestjs,Nestjs,我有教程|中的以下代码: constructor(@InjectModel('User') private readonly userModel: Model<User>) {} 您能否解释一下@InjectModel是如何工作的,什么是'User'以及我们为什么通过Model,这是什么意思 我还可以使用@InjectModel注入什么?好吧,为了深入了解这一点,首先我们必须认识到,接口在运行时并不存在。因此,您拥有的用户界面仅在开发过程中有用。我将试着一步一步地把它分解,从这一行
constructor(@InjectModel('User') private readonly userModel: Model<User>) {}
您能否解释一下@InjectModel
是如何工作的,什么是'User'
以及我们为什么通过Model
,这是什么意思
我还可以使用
@InjectModel
注入什么?好吧,为了深入了解这一点,首先我们必须认识到,接口在运行时并不存在。因此,您拥有的用户
界面仅在开发过程中有用。我将试着一步一步地把它分解,从这一行的末尾开始,然后向后工作
Model
:Model
是mongoose
公开的一种接口类型,它允许我们知道我们正在使用的模型有find
和create
等方法。通过说Model
我们是在说“这是一个mongoose模型对象,它引用了用户
界面。这对于Typescript特别有用,因为函数是用泛型键入的,它知道像find
这样的方法返回的是什么:一个User
对象数组。模型接口实际上是model
其中T
是扩展Document
(另一个mongoose
type)的接口
什么是'User'
:'User'
是与接口名称等效的字符串。如果扩展文档
的界面名为狗
,则使用狗
,如果是动物
则使用动物
。不传递接口的原因是,接口在运行时不存在(与类不同)
@InjectModel()
是如何工作的:好的,回答这个问题的真正有趣的部分。Nest通过使用注入令牌正常工作。通常,这些令牌由注入值的类型决定。在您的情况下,型号
。现在,这里的问题是A)接口在运行时不存在,B)Typescript不能很好地反映泛型,因此即使Model
是一个类,也只能得到Model
,这还不足以说明注入什么。因此,Nest采取的下一个逻辑步骤是允许用户提供注入令牌并使用@Inject()
装饰器。您可以这样做,比如注入对象(比如包配置信息)。有用,但如果不构建自己的提供者,就有点难以使用。现在进入@InjectModel()
@InjectModel()
基于传递到函数中的字符串构建注入令牌。这个标记类似于typeModel
,其中type
实际上是传递给函数的内容。这会具体告诉Nest我们正在注入什么模型。这还需要与使用MongooseModule.forFeature()
创建的提供程序对齐,因此为什么name
和传递给@InjectModel()
的值需要对齐。通常,当它们使用与接口相同的字符串名称时,最容易对齐
export interface User extends Document {
readonly name: string;
readonly age: number;
readonly phone: string;
}