#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
, и получить к ней доступ оттуда.