Passer au contenu

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é.

GoogleCloudPubSubServer
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:

Utilisation de la stratégie personnalisée
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:

Vérification des gestionnaires de messages
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:

Accès 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() :

Émission d'un événement
googlePubSubClient.emit('event', 'Hello world!');

Et c’est ce que vous devriez voir dans la console:

connect
event to dispatch: { pattern: 'event', data: 'Hello world!' }