From 06fdd00a8719be2f6e471464b9d0ce9f0ae3bc9c Mon Sep 17 00:00:00 2001 From: "val.istar.guo" Date: Mon, 29 Jan 2024 01:18:08 +0800 Subject: [PATCH] docs: use with mikro-orm --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/README.md b/README.md index 0245fdd..38ae7bf 100644 --- a/README.md +++ b/README.md @@ -167,3 +167,65 @@ export class AppService implements OnModuleInit, OnModuleDestroy { } } ``` + +## Q&A + +### `KafkaConsumer` not working with `CreateRequestContext` of `mikro-orm` + +If you don't pay attention to the order of `CreateRequestContext` decorators, +you may have problems with any of other method decorators, not only `@buka/nestjs-kafka`. + +```typescript +import { Injectable } from "@nestjs/common"; +import { KafkaConsumer, KafkaConsume, KafkaMessage } from "@buka/nestjs-kafka"; +import { CreateRequestContext } from "@mikro-orm/mysql"; + +// app.consumer.js +@Injectable() +@KafkaConsumer() +export class AppConsumer { + @CreateRequestContext() + // !! KafkaConsume decorator will not work !! + @KafkaConsume("my-topic") + async finishTask(@KafkaMessage() message: string): Promise { + console.log(message); + } +} +``` + +There are two solutions: + +1. [recommend] written as two functions: + + ```typescript + @Injectable() + @KafkaConsumer() + export class AppConsumer { + @KafkaConsume("my-topic") + async consumeMessage(@KafkaMessage() message: string): Promise { + // ... filter and format message + this.finishTask(JSON.parse(message)) + } + + @CreateRequestContext() + async finishTask(task: Task): Promise { + // do something + console.log(task); + } + ``` + +1. Pay attention to the order of `CreateRequestContext`: + + ```typescript + @Injectable() + @KafkaConsumer() + export class AppConsumer { + @KafkaConsume("my-topic") + // use CreateRequestContext as the last decorator + @CreateRequestContext() + async finishTask(@KafkaMessage() message: string): Promise { + // do something + console.log(message); + } + } + ```