NestJS搭配TypeORM使用@InjectRepository出现依赖解析错误如何解决
问题
NestJS搭配TypeORM出现依赖注入错误。
问题描述
在session.repository.ts中的自定义SessionRepository类中使用@InjectRepository装饰器时,会出现依赖无法解析的错误;但如果移除@InjectRepository装饰器,错误就会消失,应用可以正常运行。
相关文件代码
session.repository.ts
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Session } from './session.entity'; @Injectable() export class SessionRepository { constructor( // 注入该Repository时出现错误,移除注入装饰器后错误消失 @InjectRepository(Session) private readonly session: Repository<Session>, ) {} async test() { return await this.session.find(); } }
session.service.ts
import { Injectable } from '@nestjs/common'; import { ISessionConfig } from 'src/common/config/config.interface'; import { ConfigService } from 'src/common/config/config.service'; import { createHashedToken, getExpiresTime } from '../auth.helper'; import { SessionRepository } from './session.repository'; @Injectable() export class SessionService { private bytes: number; private ttl: number; constructor( private readonly configService: ConfigService, private readonly sessionRepository: SessionRepository, ) { const sessionConfig = this.configService.get<ISessionConfig>('session'); this.bytes = sessionConfig.bytes; this.ttl = sessionConfig.ttl; } getConfig(): ISessionConfig { return { bytes: this.bytes, ttl: this.ttl }; } async generateRefreshToken() { const refreshToken = await createHashedToken(this.bytes); const expires = getExpiresTime(this.ttl).toString(); return { refreshToken, expires }; } }
session.module.ts
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Session } from './session.entity'; import { SessionRepository } from './session.repository'; import { SessionService } from './session.service'; @Module({ imports: [TypeOrmModule.forFeature([Session])], providers: [SessionService, SessionRepository], exports: [SessionService, SessionRepository], }) export class SessionModule {}
auth.module.ts
import { Module } from '@nestjs/common'; import { AuthenticationModule } from './authentication/authentication.module'; import { JwtModule } from './jwt/jwt.module'; import { SessionModule } from './session/session.module'; @Module({ imports: [AuthenticationModule, JwtModule, SessionModule], }) export class AuthModule {}
database.module.ts
import { Module } from '@nestjs/common'; import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; import { IDatabaseConfig } from '../config/config.interface'; import { ConfigService } from '../config/config.service'; @Module({ imports: [ TypeOrmModule.forRootAsync({ inject: [ConfigService], useFactory: (configService: ConfigService): TypeOrmModuleOptions => { const dbConfig = configService.get<IDatabaseConfig>('database'); return { type: 'mysql', host: dbConfig.host, port: dbConfig.port, username: dbConfig.username, password: dbConfig.password, database: dbConfig.database, entities: ['dist/**/*.entity{.ts,.js}'], autoLoadEntities: true, synchronize: true, }; }, }), ], }) export class DatabaseModule {}
app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule } from './common/config/config.module'; import { DatabaseModule } from './common/database/database.module'; import { HttpLoggerMiddleware } from './common/middlewares/http-logger.middleware'; import { AuthModule } from './modules/auth/auth.module'; import { PostsModule } from './modules/posts/posts.module'; import { UsersModule } from './modules/users/users.module'; @Module({ imports: [AuthModule, ConfigModule, DatabaseModule, PostsModule, UsersModule], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(HttpLoggerMiddleware).forRoutes('*'); } }
解决方案
问题根源为命名冲突,将类名从SessionRepository修改为SessionsRepository即可解决该问题。
内容的提问来源于stack exchange,提问作者tattzetey
相关产品推荐
相关产品推荐

