В своей повседневной работе я часто сталкиваюсь с различными шаблонами и практиками в проектах 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 и найдите прекрасную работу