javascript - Injiser nestjs-tjeneste fra en annen modul
Jeg har en PlayersModule og en ItemsModule.
Jeg vil bruke ItemsService i PlayersService.
Når jeg legger det til ved injeksjon:
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){}
Jeg får denne nest-feilen :
[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest kan ikke løse avhengighetene til PlayersService (+, ?). Vennligst sørg for at argumentet på indeks [1] er tilgjengelig i den nåværende konteksten.
Begge modulene er importert i app.module.ts. Begge tjenestene fungerer alene i sin modul.
Svar #1
Du må eksportere ItemsService i modulen som tilbyr den:
@Module({
controllers: [ItemsController],
providers: [ItemsService],
exports: [ItemsService]
^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}
og deretter importere den eksporterende modulen i modulen som bruker tjenesten:
@Module({
controllers: [PlayersController],
providers: [PlayersService],
imports: [ItemsModule]
^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}
⚠️ Ikke legg til den samme leverandøren i flere moduler. Eksporter leverandøren, importer modulen. ⚠️
Svar #2
La oss si at du vil bruke AuthService fra AuthModule i kontrolløren til TaskModule
for det, må du eksportere authService fra AuthModule
@Module({
imports: [
....
],
providers: [AuthService],
controllers: [AuthController],
exports:[AuthService]
})
export class AuthModule {}
da må du i TaskModule importere AuthModule (merk: importer AuthModule, ikke AuthService i TaskModule)
@Module({
imports:[
AuthModule
],
controllers: [TasksController],
providers: [TasksService]
})
export class TasksModule {}
Nå bør du kunne bruke DI i TaskController
@Controller('tasks')
export class TasksController {
constructor(private authService: AuthService) {}
...
}
Svar #3
Spørsmålet besvares av Kim Kern. Men jeg vil bare minne folk som leser gjennom denne kommentaren. Når du får denne feilen, bør du følge disse trinnene som kan hjelpe deg med lett å finne ut hvor problemet sitter:
- Pass på at modulen som gir tilbydere ble importert.
- Sørg for at leverandøren du bruker er eksportert.
For eksempel har du kategorimodul som inneholder kategoritjeneste, postmodul har posttjeneste og den har kategoritjeneste som en avhengighet:
@Module({
controllers: [CategoryController],
providers: [CategoryService],
exports: [CategoryService] // Remember to export
})
export class CategoryModule {}
Og
@Module({
imports: [CategoryModule], // Make sure you imported the module you are using
controllers: [PostController],
providers: [PostService]
})
export class PostModule {}
Ikke glem å bruke denne annotasjonen. Nest bruker dette for å oppdage singelton-klasse. I Spring Boot - Java, ble denne tidligere kalt Bean. Les mer:
@Injectable()
export class PostService {
constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}
