Пользовательский декоратор для проверки в nesjts — на сервисном уровне

#typescript #rabbitmq #decorator #nestjs

#typescript #rabbitmq #декоратор #nestjs

Вопрос:

У меня есть подписка на службу nestjs, которая получила сообщение rabbit

   @RabbitSubscribe({
    exchange: 'test'.
    routingKey: 'test',
    queue: 'q'
  })
  async handleEvent( msg: msgModel) {
    console.log(message)
  }
  

У меня много таких подписчиков, и я хочу проверить эту модель, как мы можем сделать в контроллере с помощью validationPipe ()

но validationPipe() или guard не работают с простым сервисом

итак, я хочу создать пользовательский декоратор, который получит сообщение и проверит его

что-то вроде:

   @CustomDec(msg)
  @RabbitSubscribe({
    exchange: 'test'.
    routingKey: 'test',
    queue: 'q'
  })
  async handleEvent( msg: msgModel) {
    console.log(message)
  }

or 
  @RabbitSubscribe({
    exchange: 'test'.
    routingKey: 'test',
    queue: 'q'
  })
  async handleEvent( @customDec() msg: msgModel) {
    console.log(message)
  }


  

возможно ли это сделать?

Ответ №1:

Это должно быть просто с использованием метода-декоратора. Что-то вроде этого:

 function MsgValidator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function (...args: any[]) {
        const msgModel = args[0];
        console.log("validating msg ...");
        if(msgModel.message === "isExpectedMessage") {
            console.log("OK")
        }else {
            console.log("NOK")
        }
        return originalMethod.apply(this, args);
    }
}
  

Используйте его с:

   @RabbitSubscribe({
    exchange: 'test'.
    routingKey: 'test',
    queue: 'q'
  })
  @MsgValidator
  async handleEvent(msg: msgModel) {
    console.log(msg)
  }
  

Вот пример на ts-playground:

Комментарии:

1. спасибо, это не работает в nestjs, я добавил консоль. войдите в систему перед дескриптором, и я его получил. , но внутри дескриптора ничего не получается

2. привет, хорошо, когда я помещаю MsgValidator под @RabbitSubscribe, он работает, но только при втором вызове это означает, что 1- получено сообщение-> распечатать сообщение с подтверждением… NOK 2 — получено другое сообщение -> печать с отметкой 3 — получено другое сообщение -> печать снова

3. спасибо, это будет здорово, и проводная вещь заключается в том, почему она печатается поочередно

4. он хорошо работает, когда я. поместите его ниже, чтобы все было в порядке, вы знаете, как я могу внедрить сервис? и как я могу вернуть другое значение функции

5. Поскольку this внутри функции декоратора ссылается на service-class, вы можете внедрить требуемую службу в службу, в которой у вас есть handleEvent , и получить к ней доступ оттуда.