Det finns två sidor du måste separera. De kan vara en del av en nest.js-applikation (t.ex. hybridapplikation) eller vara i flera olika nest.js-applikationer:
Kund
Klienten sänder meddelanden om ett ämne/mönster och får ett svar från mottagaren/mottagarna av det sända meddelandet.
Först måste du ansluta din klient. Du kan göra det i onModuleInit
. I det här exemplet, ProductService
sänder ett meddelande när en ny produktenhet skapas.
@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;
}
}
Tänk på att this.client.send
returnerar en Observable
. Det betyder att ingenting kommer att hända förrän du subscribe
till det (vilket du implicit kan göra genom att anropa toPromise()
).
Mönsterhanterare
Mönsterhanteraren förbrukar meddelanden och skickar ett svar tillbaka till klienten.
@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`;
}
Naturligtvis kan en paramhanterare också vara en klient och därmed både ta emot och sända meddelanden.