Er zijn twee kanten die je moet scheiden. Ze kunnen deel uitmaken van één nest.js-applicatie (bijv. hybride applicatie) of in meerdere verschillende nest.js-applicaties:
Klant
De client zendt berichten uit over een onderwerp/patroon en ontvangt een reactie van de ontvanger(s) van het uitgezonden bericht.
Eerst moet u uw klant verbinden. U kunt dat doen in onModuleInit
. In dit voorbeeld ProductService
zendt een bericht uit wanneer een nieuwe productentiteit wordt gemaakt.
@Injectable()
export class ProductService implements OnModuleInit {
@Client({
transport: Transport.REDIS,
options: {
url: 'redis://localhost:6379',
},
})
private client: ClientRedis;
async onModuleInit() {
// Connect your client to the redis server on startup.
await this.client.connect();
}
async createProduct() {
const newProduct = await this.productRepository.createNewProduct();
// Send data to all listening to product_created
const response = await this.client.send({ type: 'product_created' }, newProduct).toPromise();
return response;
}
}
Houd er rekening mee dat this.client.send
retourneert een Observable
. Dit betekent dat er niets gebeurt totdat u zich subscribe
ernaartoe (wat u impliciet kunt doen door toPromise()
. aan te roepen ).
Patroon Handler
De patroonbehandelaar gebruikt berichten en stuurt een reactie terug naar de klant.
@Controller()
export class NewsletterController {
@MessagePattern({ type: 'product_created' })
informAboutNewProduct(newProduct: ProductEntity): string {
await this.sendNewsletter(this.recipients, newProduct);
return `Sent newsletter to ${this.recipients.length} customers`;
}
Natuurlijk kan een param-handler ook een client zijn en daarmee zowel berichten ontvangen als uitzenden.