javascript - Injektovať službu nestjs z iného modulu
Mám PlayersModule a ItemsModule.
Chcem použiť ItemsService v PlayersService.
Keď to pridám injekčne:
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){}
Dostávam túto chybu nasledujúceho druhu :
[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest nedokáže vyriešiť závislosti služby PlayersService (+, ?). Uistite sa, prosím, že argument na indexe [1] je k dispozícii v aktuálnom kontexte.
Obidva moduly sú importované v app.module.ts. Obidve služby fungujú samostatne vo svojom module.
Odpoveď č. 1
Musíte exportovať ItemsService v module, ktorý ho poskytuje:
@Module({
controllers: [ItemsController],
providers: [ItemsService],
exports: [ItemsService]
^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}
a potom naimportujte exportujúci modul do modulu, ktorý používa službu:
@Module({
controllers: [PlayersController],
providers: [PlayersService],
imports: [ItemsModule]
^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}
⚠️ Nepridávajte rovnakého poskytovateľa do viacerých modulov. Exportujte poskytovateľa, importujte modul. ⚠️
Odpoveď č. 2
Povedzme, že chcete použiť AuthService z AuthModule v kontroléri môjho TaskModule
na to musíte exportovať authService z AuthModule
@Module({
imports: [
....
],
providers: [AuthService],
controllers: [AuthController],
exports:[AuthService]
})
export class AuthModule {}
potom v TaskModule potrebujete importovať AuthModule (poznámka: importujte AuthModule, nie AuthService v TaskModule)
@Module({
imports:[
AuthModule
],
controllers: [TasksController],
providers: [TasksService]
})
export class TasksModule {}
Teraz by ste mali byť schopní použiť DI v TaskController
@Controller('tasks')
export class TasksController {
constructor(private authService: AuthService) {}
...
}
Odpoveď č. 3
Na otázku odpovedá Kim Kern. Ale chcem len pripomenúť ľuďom, ktorí si prečítajú tento komentár. Kedykoľvek dostanete túto chybu, mali by ste postupovať podľa týchto krokov, ktoré vám môžu pomôcť ľahko zistiť, kde je problém:
- Uistite sa, že modul, ktorý poskytuje poskytovateľov, bol importovaný.
- Uistite sa, že poskytovateľ, ktorého používate, je exportovaný.
Napríklad máte modul kategórie, ktorý obsahuje službu kategórie, modul príspevku má službu príspevku a má službu kategórie ako závislosť:
@Module({
controllers: [CategoryController],
providers: [CategoryService],
exports: [CategoryService] // Remember to export
})
export class CategoryModule {}
A
@Module({
imports: [CategoryModule], // Make sure you imported the module you are using
controllers: [PostController],
providers: [PostService]
})
export class PostModule {}
Nezabudnite použiť túto anotáciu. Nest ju používa na detekciu singleton triedy. V Spring Boot - Java sa táto používala pod názvom Bean. Prečítajte si viac:
@Injectable()
export class PostService {
constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}
