Ci sono due lati che devi separare. Possono far parte di un'applicazione nest.js (ad es. applicazione ibrida) o trovarsi in diverse applicazioni nest.js:
Cliente
Il client trasmette messaggi su un argomento/modello e riceve una risposta dai destinatari del messaggio trasmesso.
Per prima cosa, devi connettere il tuo client. Puoi farlo in onModuleInit
. In questo esempio, ProductService
trasmette un messaggio quando viene creata una nuova entità prodotto.
@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;
}
}
Tieni presente che this.client.send
restituisce un Observable
. Ciò significa che non accadrà nulla finché non subscribe
ad esso (cosa che puoi fare implicitamente chiamando toPromise()
).
Gestione pattern
Il gestore del pattern consuma i messaggi e invia una risposta al client.
@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`;
}
Naturalmente, un gestore di parametri potrebbe anche essere un client e quindi ricevere e trasmettere messaggi.