Можно ли использовать несколько декораторов для одного метода в Nestjs? - PullRequest
0 голосов
/ 14 марта 2019

Я хочу написать меньше кода, поэтому я объединяю создание и обновление кода в один метод, похоже, он не может работать.

@Post('user')
@Put('user')
async createOrUpdateUser(@Res() res, @Req() req) {
  if (req.method == 'POST') {
    //do user creating work
  } else {
    //do user updating work
  }
}

Я пробовал, но работает только декоратор @Postздесь.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

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

@Post('user')
async createUser(@Res() res, @Req() req) {
  if(req.method=='POST')
  {
    //do user creating work
  }else {
    //do user updating work
  }
}

@Put('user')
async updateUser(@Res() res, @Req() req) {
 this.createUser(res, req);
}
0 голосов
/ 16 марта 2019

Вы можете использовать декоратор @All для обработки всех методов запроса одним методом:

@All('user')
async createOrUpdateUser(@Req() req) {
  switch (req.method) {
    case 'POST':
      return 'new user';
    case 'PUT':
      return 'updated user';
    default:
      return throw new NotFoundException();
  }
}

Если вы определите обработчик @Get('user') перед обработчиком @All('user'), он будет обрабатывать запросы get. (Я бы посоветовал не делать этого, см. Ниже.)


Обратить

1) Внедрив объект отклика, специфичный для фреймворка, с помощью @Res, вы потеряете большинство функций, делающих гнездо таким замечательным, как перехватчики или сериализация. Делайте это только если вам действительно нужно.

2) Я всегда предпочитаю извлекать общую логику в метод или класс вместо создания условных ветвей в методе. На мой взгляд, это более читаемый и понятный подход. Это также упрощает другие интеграции гнезд, например, с помощью swagger для легкого документирования вашего API.

@Put('user')
async update(@Body() body) {
  const user = await this.service.prepare(body);
  return this.service.updateUser(user);
}

@Post('user')
async update(@Body() body) {
  const user = await this.service.prepare(body);
  return this.service.createUser(user);
}

В этом примере общие части были извлечены в UserService#prepare.

...