Der er to sider, du skal adskille. De kan være en del af én nest.js-applikation (f.eks. hybridapplikation) eller være i flere forskellige nest.js-applikationer:
Kunde
Klienten udsender beskeder om et emne/mønster og modtager et svar fra modtageren(e) af den udsendte besked.
Først skal du forbinde din klient. Du kan gøre det i onModuleInit
. I dette eksempel ProductService
udsender en besked, når en ny produktentitet oprettes.
@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;
}
}
Husk, at this.client.send
returnerer en Observable
. Det betyder, at der ikke sker noget, før du subscribe
til det (hvilket du implicit kan gøre ved at kalde toPromise()
).
Mønsterhåndtering
Mønsterbehandleren bruger meddelelser og sender et svar tilbage til 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`;
}
En param-handler kunne selvfølgelig også være en klient og dermed både modtage og udsende beskeder.