Trzeba rozdzielić dwie strony. Mogą być częścią jednej aplikacji nest.js (np. aplikacji hybrydowej) lub znajdować się w kilku różnych aplikacjach nest.js:
Klient
Klient emituje wiadomości na temat/wzorzec i otrzymuje odpowiedź od odbiorców wyemitowanej wiadomości.
Najpierw musisz połączyć swojego klienta. Możesz to zrobić w onModuleInit
. W tym przykładzie ProductService
emituje komunikat, gdy tworzony jest nowy produkt.
@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;
}
}
Pamiętaj, że this.client.send
zwraca Observable
. Oznacza to, że nic się nie stanie, dopóki subscribe
do niego (co można zrobić pośrednio, wywołując toPromise()
).
Obsługa wzorów
Procedura obsługi wzorca zużywa wiadomości i wysyła odpowiedź z powrotem do klienta.
@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`;
}
Oczywiście, operator param może być również klientem, a tym samym zarówno odbierać, jak i rozgłaszać komunikaty.