programing

다른 모듈에서 nestjs 서비스를 주입합니다.

elseif 2023. 4. 4. 21:07

다른 모듈에서 nestjs 서비스를 주입합니다.

나 있어PlayersModule그리고ItemsModule.

사용하고 싶다ItemsService에서PlayersService.

주입으로 추가할 경우:

import { Injectable } from '@nestjs/common';
import { InjectModel } from 'nestjs-typegoose';
import { ModelType, Ref } from 'typegoose';
import { Player } from './player.model';
import { Item } from '../items/item.model';
import { ItemsService } from '../items/items.service';

@Injectable()
export class PlayersService {
    constructor(
        @InjectModel(Player) private readonly playerModel: ModelType<Player>,
        private readonly itemsService: ItemsService){}

다음 네스트 에러가 표시됩니다.

[네스트] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest가 PlayersService(+, ?)의 의존관계를 해결할 수 없습니다.인덱스 [1]의 인수를 현재 컨텍스트에서 사용할 수 있는지 확인하십시오.

양쪽 모듈이 로 Import 됩니다.app.module.ts두 서비스 모두 모듈에서 단독으로 동작하고 있습니다.

내보내야 합니다.ItemsService를 참조해 주세요.

@Module({
  controllers: [ItemsController],
  providers: [ItemsService],
  exports: [ItemsService]
  ^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}

그런 다음 서비스를 사용하는 모듈의 내보내기 모듈을 Import합니다.

@Module({
  controllers: [PlayersController],
  providers: [PlayersService],
  imports: [ItemsModule]
  ^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}

⚠13 여러 모듈에 동일한 공급자를 추가하지 마십시오.공급자를 내보내고 모듈을 가져옵니다.⚠️

TaskModule의 컨트롤러에서 AuthModule의 AuthService를 사용한다고 가정합니다.

이를 위해서는 AuthModule에서 authService를 내보내야 합니다.

@Module({
    imports: [
     ....
    ],
    providers: [AuthService],
    controllers: [AuthController],
    exports:[AuthService]
  })
export class AuthModule {}
  

다음으로 TaskModule에서 AuthModule을 Import해야 합니다(주의: TaskModule의 AuthService가 아닌 AuthModule을 Import합니다).

@Module({
    imports:[
      AuthModule
    ],
    controllers: [TasksController],
    providers: [TasksService]
  })
export class TasksModule {}

이제 TaskController에서 DI를 사용할 수 있습니다.

@Controller('tasks')
export class TasksController {
   constructor(private authService: AuthService) {}
   ...
}
  

그 질문은 Kim Kern에 의해 답변되었다.하지만 나는 이 댓글을 읽는 사람들에게 상기시켜주고 싶다.이 에러가 발생하는 경우는, 다음의 순서에 따라서, 막혀 있는 장소를 간단하게 특정할 수 있습니다.

  • 공급자를 제공하는 모듈이 Import되었는지 확인합니다.
  • 사용하고 있는 프로바이더가 export 되어 있는 것을 확인합니다.

예를 들어 카테고리 서비스를 포함하는 카테고리 모듈이 있고 포스트 모듈은 포스트 서비스를 포함하며 카테고리 서비스는 종속 서비스입니다.

@Module({
    controllers: [CategoryController],
    providers: [CategoryService],
    exports: [CategoryService] // Remember to export
  })
export class CategoryModule {}

그리고.

@Module({
    imports: [CategoryModule], // Make sure you imported the module you are using
    controllers: [PostController],
    providers: [PostService]
  })
export class PostModule {}

이 주석을 사용하는 것을 잊지 마세요.Nest는 이를 사용하여 싱글톤클래스를 검출합니다.spring boot - Java 에서는, 이것은 Bean이라고 불리고 있었습니다.상세보기:

@Injectable()  
export class PostService {
  constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}

나는 내 문제를 해결했다.@Inject()내보내기된 서비스를 전달하고 있는 컨스트럭터의 인수에서 제외됩니다.

당신도 나와 같은 문제에 직면했다고 생각해요.제 시나리오는 서로의 서비스를 사용해야 하는 2개의 형제 커스텀 모듈(사용자, 인증)이었습니다.원형 DI를 사용하여 해결했습니다. 이 링크를 확인하십시오.

문제가 해결됐는지 알려주시면 제가 더 조언해 드릴 수 있을 것 같습니다.

프로바이더의 @Inject()에서 사용되는 상수 문자열(TOKEN) Import 방법을 변경하여 문제를 해결했습니다.module.ts에서 index.ts 내보내기* 를 사용해도 nest는 의존관계를 해결할 수 없습니다.

Kim Kern의 답변에 따르면, 현재 서비스에는 데코레이터 없이 주입된 서비스만 추가해야 합니다(@Inject()는 필요 없습니다).그 후에는 올바르게 동작합니다.그것은 나의 실수였고 다른 사람들을 도울 수 있을 것이다.

순서 1순서 2 의 파일을 export 합니다.모듈 전체를 Import 합니다.

처음에 파일을 프로바이더로 추가하고 모듈을 추가하는 실수를 해서 오류가 발생하였습니다.

언급URL : https://stackoverflow.com/questions/51819504/inject-nestjs-service-from-another-module