Transporteurs personnalisés
Nest fournit une variété de transporteurs prêts à l’emploi, ainsi qu’une API permettant aux développeurs de créer de nouvelles stratégies de transport personnalisées.
Les transporteurs vous permettent de connecter des composants sur un réseau en utilisant une couche de communication rechargeable et un protocole de message au niveau de l’application très simple (lisez l’article complet).
Avec un transporteur personnalisé, vous pouvez intégrer n’importe quel système/protocole de messagerie (y compris Google Cloud Pub/Sub, Amazon Kinesis, et d’autres) ou étendre l’existant, ajoutant des fonctionnalités supplémentaires (par exemple, QoS pour MQTT).
Création d’une stratégie
D’abord, définissons une classe représentant notre transporteur personnalisé.
import { CustomTransportStrategy, Server } from '@nestjs/microservices';
class GoogleCloudPubSubServer extends Server implements CustomTransportStrategy { /** * Cette méthode est déclenchée lorsque vous exécutez "app.listen()". */ listen(callback: () => void) { callback(); }
/** * Cette méthode est déclenchée lors de l'arrêt de l'application. */ close() {}}
Dans notre exemple ci-dessus, nous avons déclaré la classe GoogleCloudPubSubServer
et fourni les méthodes listen()
et close()
imposées par l’interface CustomTransportStrategy
.
De plus, notre classe étend la classe Server
importée de @nestjs/microservices
, qui fournit quelques méthodes utiles, par exemple, les méthodes utilisées par l’exécution de Nest pour enregistrer les gestionnaires de messages.
Avec cela en place, nous pouvons maintenant utiliser notre stratégie personnalisée au lieu d’utiliser un transporteur intégré, comme suit:
const app = await NestFactory.createMicroservice<MicroserviceOptions>( AppModule, { strategy: new GoogleCloudPubSubServer(), },);
Fondamentalement, au lieu de passer l’objet d’options de transporteur normal avec les propriétés transport
et options
, nous passons une seule propriété, strategy
, dont la valeur est une instance de notre classe de transporteur personnalisé.
Revenons à notre classe GoogleCloudPubSubServer
. Dans une application réelle, nous devrions établir une connexion à notre courtier de messages/service externe et enregistrer des abonnés/écouter des canaux spécifiques dans la méthode listen()
(et ensuite retirer les abonnements et fermer la connexion dans la méthode de nettoyage close()
).
Pour voir ce qui a été enregistré, ajoutons un simple console.log
à l’intérieur de la méthode listen()
avant que la fonction callback
ne soit appelée:
listen(callback: () => void) { console.log(this.messageHandlers); callback();}
Une fois votre application redémarrée, vous verrez le journal suivant dans votre terminal:
Map { 'echo' => [AsyncFunction] { isEventHandler: false } }
Comme vous pouvez le voir, la propriété messageHandlers
est une collection Map
de tous les gestionnaires de messages (et d’événements), dans laquelle les modèles sont utilisés comme clés.
Maintenant, vous pouvez utiliser une clé (par exemple, "echo"
) pour recevoir une référence au gestionnaire de messages:
async listen(callback: () => void) { const echoHandler = this.messageHandlers.get('echo'); console.log(await echoHandler('Hello world!')); callback();}
Enfin, pour émettre un événement (au lieu d’envoyer un message), utilisez la méthode emit()
:
googlePubSubClient.emit('event', 'Hello world!');
Et c’est ce que vous devriez voir dans la console:
connectevent to dispatch: { pattern: 'event', data: 'Hello world!' }