Гнездо js расширяют / объединяют декораторы - PullRequest
0 голосов
/ 15 марта 2020

У меня есть простой пользовательский декоратор:

export const User: () => ParameterDecorator = createParamDecorator(
  (data: any, req): UserIdentity => {
    const user = getUser(req);
    return user;
  },
); 

А теперь мне нужно проверить, есть ли у нас email в user объекте.

Проблема в том, что я могу ' t обновить мой текущий декоратор.

Могу ли я расширить свой текущий декоратор?

Создать новый декоратор на основе предыдущего или создать новый декоратор и объединить его?

1 Ответ

1 голос
/ 17 марта 2020

Да, вы можете сделать "композицию декоратора" с Nest, но это может быть не лучшим решением для вашего случая, в зависимости от того, что вы собираетесь делать, когда user не имеет свойства email .

В соответствии с примером из документации:

import { applyDecorators } from '@nestjs/common';

export function Auth(...roles: Role[]) {
  return applyDecorators(
    SetMetadata('roles', roles),
    UseGuards(AuthGuard, RolesGuard),
    ApiBearerAuth(),
    ApiUnauthorizedResponse({ description: 'Unauthorized"' }),
  );
}

В этом примере Auth - это декоратор, который можно использовать для объединения всего одного, переданного в * 1012. *.


Таким образом, я бы рекомендовал расширить вашего декоратора, используя трубу .

Как указано в документации :

Nest обрабатывает пользовательские декораторы параметров так же, как и встроенные (@Body (), @Param () и @Query ()). Это означает, что каналы выполняются и для пользовательских аннотированных параметров (в наших примерах пользовательский аргумент). Кроме того, вы можете применить конвейер непосредственно к пользовательскому декоратору:

@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}

В этом примере User - это декоратор пользовательских параметров. И ValidationPipe пройдено, но вы можете представить проход любой трубы .

...