Hay dos lados que necesitas separar. Pueden ser parte de una aplicación nest.js (por ejemplo, una aplicación híbrida) o estar en varias aplicaciones nest.js diferentes:
Cliente
El cliente transmite mensajes sobre un tema/patrón y recibe una respuesta de los receptores del mensaje transmitido.
Primero, tienes que conectar tu cliente. Puedes hacerlo en onModuleInit
. En este ejemplo, ProductService
transmite un mensaje cuando se crea una nueva entidad de producto.
@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;
}
}
Tenga en cuenta que this.client.send
devuelve un Observable
. Esto significa que no pasará nada hasta que subscribe
a él (lo que puede hacer implícitamente llamando a toPromise()
).
Controlador de patrones
El controlador de patrones consume mensajes y envía una respuesta al 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`;
}
Por supuesto, un controlador de parámetros también podría ser un cliente y, por lo tanto, recibir y transmitir mensajes.