nestjs есть ли разница с async / await или без него?

#node.js #promise #async-await #nestjs

#node.js #обещание #асинхронный-ожидание #гнездо js #async-await #nestjs

Вопрос:

Я думал, что нет никаких различий между:

 @Post()
saveClient(@Param() params, @Body() createClientDto: ClientDto) {
   this.clientRepository.save(createClientDto);
  }
  

и

 @Post()
  async saveClient(@Param() params, @Body() createClientDto: ClientDto) {
   await this.clientRepository.save(createClientDto);
  }
  

Но без async / await функция возвращает void, и если возникает исключение, я получаю это:

(узел: 62777) Предупреждение о необработанном PROMISEREJECTIONWARNING: отклонение необработанного обещания. Эта ошибка возникла либо из-за включения асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch(). Чтобы завершить процесс узла при отклонении необработанного обещания. (узел: 62827) [DEP0018] Предупреждение об устаревании: Необработанные отклонения обещаний не рекомендуются. В будущем отклонения обещаний, которые не обрабатываются, завершат Node.js процесс с ненулевым кодом выхода.

При использовании async/await вышеупомянутое предупреждение не отображается, так как функция возвращает обещание. То же самое, если я добавлю возврат:

 @Post()
saveClient(@Param() params, @Body() createClientDto: ClientDto) {
   return this.clientRepository.save(createClientDto);
  }
  

Итак, я немного обеспокоен: простой отсутствующий возврат может прервать мой процесс nestjs?

Спасибо

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

1. ДА. Неспособность вернуть обещание в вашем первом примере означает, что никто не обращает внимания, когда в этой операции возникает ошибка, поскольку нет локального .catch() , поэтому единственный способ для вызывающей стороны обработать ошибку — это вернуть ее. Это фундаментальная ошибка программирования обещаний — либо не возвращать обещание, чтобы вызывающий мог обрабатывать ошибки, либо обрабатывать ошибки локально с .catch() .

2. Я бы рекомендовал использовать with '@typescript-eslint/no-floating-promises': 'error' . Обработка NestJS (или NodeJS здесь) правильная — если вы не хотите возвращать это клиенту API, вам понадобится await. В противном случае используйте return (хорошо сочетается с фильтрами исключений). Если вы хотите ожидать ошибок и по-прежнему показывать «успех» клиенту API, используйте .catch() и обрабатывайте его там.

Ответ №1:

попробуйте завернуть это в try / catch

 @Post()
  async saveClient(@Param() params, @Body() createClientDto: ClientDto) {
    try {
       await this.clientRepository.save(createClientDto);
    } catch(err) {
       console.log(err);
    }
  }
  

Ответ №2:

  • Предупреждение о необработанном PROMISEREJECTIONWARNING означает, что необходимо обрабатывать каждое обещание, поскольку оно потенциально может быть отклонено.
  • «возврат» в обработчике контроллера будет в основном отправляться как ответ тела http. Конечно, это может быть вызвано перехватчиками, промежуточным программным обеспечением и фильтром исключений, если они у вас есть.
   @Post()
  saveClient(@Param() params, @Body() createClientDto: ClientDto) {
    return this.clientRepository.save(createClientDto)
      .catch((err) => console.log(err));
  }