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;
}