В своей повседневной работе я часто сталкиваюсь с различными шаблонами и практиками в проектах JavaScript и TypeScript. Хотя многие из этих практик замечательны, я иногда замечаю повторяющиеся проблемы, которые можно решить с помощью более эффективных решений. Сегодня я хотел бы поделиться простым, но мощным советом, который может значительно упростить ваш код.
Этот практический совет посвящен общей теме разработки приложений — обработке ошибок. Если вы знакомы с JavaScript или TypeScript, вы, вероятно, использовали блоки try/catch
в своих асинхронных функциях. Этот шаблон незаменим для обнаружения и обработки ошибок во время выполнения, но я заметил, что он часто приводит к повторяющемуся коду в разных частях проекта.
Одним из распространенных шаблонов в приложениях Express.js является обработка ошибок в каждом маршруте или функции обработчика. Как правило, это включает в себя перенос логики обработчика в блок try/catch
, а затем отправку соответствующего ответа в блок catch
, если что-то пойдет не так. Однако это может привести к большому количеству повторяющегося кода, если одна и та же логика обработки ошибок используется для нескольких маршрутов. Давайте рассмотрим, как упростить это, используя функции высшего порядка.
Проблема с повторяющейся обработкой ошибок
Давайте взглянем на типичную функцию-обработчик:
export const handleGetUsers = async(req: Request, res: Response) => { try{ // Call service }catch(error){ log.error(error); res.status(500).send("Server Error."); } }
Здесь, если во время выполнения логики обработчика возникает ошибка, она перехватывается и регистрируется, а в качестве ответа отправляется общее сообщение «Ошибка сервера».
Проблема в том, что если каждая функция-обработчик имеет одинаковую обработку ошибок, мы в конечном итоге будем дублировать один и тот же блок catch
снова и снова. Это не очень СУХОЕ (не повторяйтесь), и это прекрасная возможность для абстракции.
Упрощение с помощью функций высшего порядка
Функции высшего порядка — мощная функция JavaScript. Это функции, которые принимают другие функции в качестве аргументов или возвращают функции. В этом случае мы можем создать функцию более высокого порядка, которая принимает функцию обработчика Express.js в качестве аргумента и возвращает новую функцию со встроенной обработкой ошибок.
Вот как это может выглядеть:
const withErrorHandling = (handler: (req: Request, res: Response) => Promise<void>) => { return async (req: Request, res: Response) => { try { await handler(req, res); } catch (error) { log.error(error); res.status(500).send('Server Error.'); } }; };
Функция withErrorHandling
заключает исходный обработчик в блок try/catch
, так что теперь наши обработчики могут сосредоточиться исключительно на своей собственной логике:
export const handleGetUsers = withErrorHandling(async (req: Request, res: Response) => { // Call services });
Таким образом, мы значительно упростили наш код и сделали его более СУХИМ. Мы централизовали логику обработки ошибок в одной функции, которую можно повторно использовать во всех наших обработчиках.
Заключение
Обработка ошибок является важной частью создания надежных приложений. Функции высшего порядка в JavaScript предоставляют мощный инструмент для абстрагирования повторяющейся логики, такой как обработка ошибок в обработчиках маршрутов Express.js. При таком подходе мы можем сохранить нашу кодовую базу СУХОЙ и сосредоточиться на том, что действительно важно: приносить пользу нашим пользователям.
Помните, всегда используйте async
для функций, переданных в withErrorHandling
, иначе ошибки могут быть неправильно обнаружены.
Ура!
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу