Existem dois lados que você precisa separar. Eles podem fazer parte de um aplicativo nest.js (por exemplo, aplicativo híbrido) ou estar em vários aplicativos nest.js diferentes:
Cliente
O cliente transmite mensagens em um tópico/padrão e recebe uma resposta do(s) receptor(es) da mensagem transmitida.
Primeiro, você precisa conectar seu cliente. Você pode fazer isso em
onModuleInit
. Neste exemplo, ProductService
transmite uma mensagem quando uma nova entidade de produto é criada. @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;
}
}
Lembre-se de que
this.client.send
retorna um Observable
. Isso significa que nada acontecerá até você subscribe
para ele (o que você pode fazer implicitamente chamando toPromise()
). Gerenciador de padrões
O manipulador de padrões consome mensagens e envia uma resposta de volta ao cliente.
@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`;
}
Obviamente, um manipulador de parâmetros também pode ser um cliente e, com isso, receber e difundir mensagens.