Има две страни, които трябва да разделите. Те могат да бъдат част от едно nest.js приложение (напр. хибридно приложение) или да бъдат в няколко различни nest.js приложения:
Клиент
Клиентът излъчва съобщения по тема/модел и получава отговор от получателя(ите) на излъченото съобщение.
Първо, трябва да свържете своя клиент. Можете да направите това в onModuleInit
. В този пример ProductService
излъчва съобщение, когато се създаде нов продукт.
@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;
}
}
Имайте предвид, че this.client.send
връща Observable
. Това означава, че нищо няма да се случи, докато не subscribe
към него (което можете имплицитно да направите, като извикате toPromise()
).
Манипулатор на шаблони
Манипулаторът на шаблона консумира съобщения и изпраща отговор обратно на клиента.
@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`;
}
Разбира се, манипулаторът на параметри може също да бъде клиент и с това да получава и изпраща съобщения.