NestJS项目中Reports Controller无法注入Users Service问题求助
问题:NestJS跨模块注入UsersService报错
我正在开发一个NestJS小型项目,包含reports和users两个独立模块,各自拥有Service、Controller和Repository。reports与users为多对一关系,我想给reports添加user属性,于是尝试在ReportsController中注入UsersService,但遇到了依赖注入错误。
相关代码
users.service.ts
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Users } from './users.entity'; @Injectable() export class UsersService { constructor( @InjectRepository(Users) private userRepository: Repository<Users> ) { userRepository.remove = userRepository.softRemove; userRepository.delete = userRepository.softDelete; } createUser(body: object) { const instance = this.userRepository.create(body); return this.userRepository.save(instance); } find(query: object) { return this.userRepository.find({ "where": query }) } findOne(id: any) { if (!id) { throw new BadRequestException('Id not found') } return this.userRepository.findOne({ "where": { "id": id } }); } async update(id: string, record: Partial<Users>) { var user = await this.findOne(id); if (!user) { return new NotFoundException('User Not Found'); } return this.userRepository.save(Object.assign(user, record)); } async delete(id: string) { var user = await this.findOne(id); if (!user || user === null) { throw new NotFoundException('User Not Found'); } else { this.userRepository.remove(user) return "Successfully deleted" } } }
reports.controller.ts
import { Body, ClassSerializerInterceptor, Controller, Post, Session, UseGuards, UseInterceptors } from '@nestjs/common'; import { UsersService } from 'src/users/users.service'; import { ReportsService } from './reports.service'; @Controller('reports') export class ReportsController { constructor( private reportsService: ReportsService, private usersService: UsersService ) { } }
错误说明
报错核心是UsersService无法被解析,原因是NestJS模块默认隔离,ReportsModule无权直接访问UsersModule内的服务。
解决步骤
在UsersModule中导出UsersService
修改users.module.ts,将UsersService加入exports数组,开放给其他模块使用:import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Users } from './users.entity'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; @Module({ imports: [TypeOrmModule.forFeature([Users])], providers: [UsersService], controllers: [UsersController], exports: [UsersService] // 新增导出配置 }) export class UsersModule {}在ReportsModule中导入UsersModule
修改reports.module.ts,将UsersModule加入imports数组,让ReportsModule能获取到UsersService:import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Reports } from './reports.entity'; import { ReportsService } from './reports.service'; import { ReportsController } from './reports.controller'; import { UsersModule } from '../users/users.module'; // 导入UsersModule @Module({ imports: [TypeOrmModule.forFeature([Reports]), UsersModule], // 新增UsersModule导入 providers: [ReportsService], controllers: [ReportsController] }) export class ReportsModule {}验证根模块配置
确保AppModule中同时导入了UsersModule和ReportsModule,保证两个模块都能被NestJS正常加载。
原理说明
NestJS模块采用隔离设计,模块内的Provider默认仅在本模块可见。要跨模块使用Provider,必须先在其所属模块的exports中声明导出,再在目标模块的imports中导入该模块,才能完成依赖注入。
内容的提问来源于stack exchange,提问作者user20181423
相关产品推荐
相关产品推荐

