NestJS中Mongoose模型调用findOne报错:Cannot read properties of undefined
核心问题:this.oauthClientModel为undefined,导致调用findOne时触发TypeError: Cannot read properties of undefined (reading 'findOne'),且其他服务同方式导入模型可正常运行,说明问题集中在OAuth2模块/服务的依赖注入环节。
排查与解决步骤
1. 检查模型注入的正确性
确保OAuth2Service通过构造函数依赖注入获取模型,而非手动导入实例:
import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { OAuthClient } from './schemas/oauth-client.schema'; // 你的Schema定义 @Injectable() export class Oauth2Service { // 必须使用@InjectModel装饰器注入,参数为Schema的name属性 constructor( @InjectModel(OAuthClient.name) private readonly oauthClientModel: Model<OAuthClient>, ) {} // ... 你的getClient方法 }
如果是直接import模型实例使用(如import { oauthClientModel } from './xxx'),会脱离NestJS依赖注入容器,导致模型未初始化。
2. 确认OAuth2Module的模块配置
在Oauth2Module中,必须导入MongooseModule.forFeature注册模型,否则服务无法获取注入实例:
import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { Oauth2Service } from './oauth2.service'; import { OAuthClient, OAuthClientSchema } from './schemas/oauth-client.schema'; @Module({ imports: [ // 注册模型到当前模块 MongooseModule.forFeature([{ name: OAuthClient.name, schema: OAuthClientSchema }]), ], providers: [Oauth2Service], exports: [Oauth2Service], // 若其他模块需调用此服务,需导出 }) export class Oauth2Module {}
根模块(如AppModule)的MongooseModule.forRoot配置可跳过检查(其他服务正常说明此配置没问题)。
3. 验证服务实例化方式
如果OAuth2服务被第三方库(如nestjs-passport相关组件)调用,需确保第三方库通过NestJS依赖注入容器获取服务,而非手动创建实例。比如使用Passport时,要保证Oauth2Service已注册到模块的providers中,且第三方模块能访问到它。
4. 检查模型名称匹配性
@InjectModel(OAuthClient.name)中的名称,必须与MongooseModule.forFeature里的name完全一致(包括大小写),否则注入会失败。
5. 排查循环依赖问题
若OAuth2模块与其他模块存在循环依赖,会导致模型注入失效,可通过forwardRef解决:
// Oauth2Module中导入其他模块时 imports: [ forwardRef(() => OtherModule), MongooseModule.forFeature([{ name: OAuthClient.name, schema: OAuthClientSchema }]), ]
同时在关联模块中导入Oauth2Module时也需使用forwardRef。
临时调试技巧
在OAuth2Service的构造函数中打印模型,确认注入是否成功:
constructor( @InjectModel(OAuthClient.name) private readonly oauthClientModel: Model<OAuthClient>, ) { console.log('构造函数内的模型:', this.oauthClientModel); }
- 若构造函数内模型为
undefined:说明模块导入或注入配置错误 - 若构造函数内有值,但
getClient中为undefined:检查this指向(比如是否使用普通函数而非箭头函数导致this丢失)
内容的提问来源于stack exchange,提问作者codepip55

