You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:00:04