web-dev-qa-db-fra.com

Comment injecter un service dans un service importé Nestjs

J'ai un module personnalisé AuthModule avec AuthService, AuthController avec des routes et ainsi de suite, qui fonctionne bien, et je souhaite partager ce module entre plusieurs projets sous forme de package. La question est de savoir comment étendre les AuthService importés de ce package et comment y injecter des services supplémentaires?

Plus de détails

Dans ma AuthService personnalisée, que je veux placer dans le package, est injectée la classe UserService, qui obtient par défaut de la base de données des données User et les renvoie du côté client. Je dois injecter dans AuthService un autre, par exemple ProfileService à partir de l'application, qui obtient de la base de données User des données supplémentaires. Le but est de fusionner User les données principales et User les données supplémentaires, et de renvoyer ce groupe au client

9

C'est l'un des cas d'utilisation modules dynamiques ont été créés pour.

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

Dans cet exemple, voyez comment providers est donné (dynamiquement) au module de résultat.

Votre package doit suivre le même modèle: exposer une méthode statique qui permet de construire un DynamicModule, afin que vous puissiez résoudre vos autres services (internes ou externes) comme vous le souhaitez (construire votre propre tableau de providers ).

2
VinceOPS

Je ne vois pas vraiment le besoin d'un module dynamique ici.

En effet, il suffit que le service que vous souhaitez injecter dans une autre entité gérée par NestJs soit exporté depuis votre AuthModule et AuthModule importé dans le module que vous souhaitez que d'autres entités aient injecté votre AuthService.

import { Module } from '@nestjs/common'
import { AuthService } from './AuthService'

@Module({
  providers: [
    AuthService,
    // ... others
  ],
  exports: [
    AuthService
  ]
})
export class CommonModule {}

Ensuite, dans votre classe dépendante (disons un autre contrôleur, mais pourrait être quelque chose comme un résolveur GraphQL, un intercepteur ou autre), vous déclarez la dépendance à AuthService.

import { AuthService } from '../auth/AuthService'
import { Dependencies } from '@nestjs/common'

@Dependencies(AuthService)
export class DependentController {
  constructor (authService) {
    this.authService = authService
  }
}

Enfin, pour que AuthService soit disponible pour le contrôleur dépendant, il doit être importé dans le même module que le contrôleur fourni.

import { Module } from '@nestjs/common'
import { CommonModule } from '../auth/CommonModule'
import { DependentController } from './controller/DependentController'

@Module({
  imports: [
    CommonModule,
    // ...others
  ],
  providers: [
    DependentController,
    // ...others
  ]
})
export class ControllerModule {}

Je comprends que la syntaxe pourrait être plus courte et sans utiliser le décorateur de dépendances dans TypeScript, mais le cœur du problème est l'exportation du service partagé à partir du module qui lui est fourni, puis l'importation de ce module dans le module d'autres classes qui en ont besoin.

1
Jesús Franco