Es gibt zwei Seiten, die Sie trennen müssen. Sie können Teil einer nest.js-Anwendung (z. B. Hybridanwendung) oder in mehreren verschiedenen nest.js-Anwendungen sein:
Kunde
Der Client sendet Nachrichten zu einem Thema/Muster und erhält eine Antwort von dem/den Empfänger(n) der gesendeten Nachricht.
Zuerst müssen Sie Ihren Client verbinden. Das können Sie in onModuleInit
tun . In diesem Beispiel ProductService
sendet eine Nachricht, wenn eine neue Produktentität erstellt wird.
@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;
}
}
Denken Sie daran, dass this.client.send
gibt ein Observable
zurück . Das bedeutet, dass nichts passiert, bis Sie sich subscribe
(was Sie implizit tun können, indem Sie toPromise()
aufrufen ).
Muster-Handler
Der Musterhandler verarbeitet Nachrichten und sendet eine Antwort an den Client zurück.
@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`;
}
Natürlich könnte ein Param-Handler auch ein Client sein und damit sowohl Nachrichten empfangen als auch senden.