#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));
}