Có hai mặt bạn cần phải tách biệt. Chúng có thể là một phần của một ứng dụng nest.js (ví dụ:ứng dụng kết hợp) hoặc nằm trong một số ứng dụng nest.js khác nhau:
Khách hàng
Máy khách phát thông báo về một chủ đề / mẫu và nhận được phản hồi từ (các) người nhận thông báo đã phát.
Đầu tiên, bạn phải kết nối khách hàng của mình. Bạn có thể làm điều đó trong onModuleInit
. Trong ví dụ này, ProductService
phát thông báo khi một thực thể sản phẩm mới được tạo.
@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;
}
}
Hãy nhớ rằng this.client.send
trả về một Observable
. Điều này có nghĩa là, sẽ không có gì xảy ra cho đến khi bạn subscribe
với nó (mà bạn có thể hoàn toàn thực hiện bằng cách gọi toPromise()
).
Trình xử lý mẫu
Trình xử lý mẫu sử dụng thông báo và gửi phản hồi trở lại máy khách.
@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`;
}
Tất nhiên, một trình xử lý tham số cũng có thể là một ứng dụng khách và ở đó cả nhận và phát tin nhắn.