Jsou dvě strany, které musíte oddělit. Mohou být součástí jedné aplikace nest.js (např. hybridní aplikace) nebo mohou být součástí několika různých aplikací nest.js:
Klient
Klient vysílá zprávy na téma/vzor a přijímá odpověď od příjemce (příjemců) vysílané zprávy.
Nejprve musíte připojit svého klienta. Můžete to udělat v onModuleInit
. V tomto příkladu ProductService
vysílá zprávu, když je vytvořena nová entita produktu.
@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;
}
}
Mějte na paměti, že this.client.send
vrátí Observable
. To znamená, že se nic nestane, dokud se subscribe
k němu (což můžete implicitně provést voláním toPromise()
).
Obslužný program vzoru
Obslužný program vzoru spotřebovává zprávy a odešle odpověď zpět klientovi.
@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`;
}
Samozřejmě, že obslužná rutina param může být také klientem a tím přijímat i vysílat zprávy.