Во время третьей недели Хактоберфеста я решил внести свой вклад в небольшой, но многообещающий проект: систему онлайн-аукционов. Хотя проект все еще находится на ранней стадии, он уже демонстрирует потенциал для роста, и я увидел возможность помочь улучшить его кодовую базу. Моей задачей было провести рефакторинг проекта, сократив избыточный код и улучшив общую структуру, сделав его более удобным в сопровождении и масштабируемом.
Основной целью моей задачи было выявление повторяющихся шаблонов кода и их рефакторинг, чтобы сделать кодовую базу более чистой и простой в обслуживании. Избыточность кода может привести к несогласованности, затруднить будущие обновления и увеличить вероятность ошибок. Оптимизируя код, я стремился повысить эффективность без изменения функциональности.
1. Централизованная асинхронная обработка ошибок: Одной из распространенных проблем в проектах Express.js являются повторяющиеся блоки try-catch для обработки ошибок в асинхронных маршрутах. Чтобы решить эту проблему, я представил служебную функцию под названием asyncHandler, которая охватывает все асинхронные функции, гарантируя, что любые ошибки автоматически обнаруживаются и последовательно обрабатываются во всем приложении.
// utils/asyncHandler.js const asyncHandler = (fn, errorMessage = "Internal server error") => (req, res, next) => Promise.resolve(fn(req, res, next)).catch((error) => { console.error(`Error: ${error.message}`); res.status(500).json({ error: errorMessage }); }); module.exports = asyncHandler;
Это изменение не только удалило избыточные блоки try-catch, но также сделало код более чистым и более ориентированным на бизнес-логику, а не на обработку ошибок.
2. Функции утилиты базы данных: В проекте было несколько маршрутов, которые напрямую взаимодействовали с базой данных, часто повторяя похожие запросы. Чтобы уменьшить избыточность, я создал набор повторно используемых служебных функций для обработки общих запросов к базе данных, таких как получение информации о покупателе или получение транзакций.
// utils/dbUtils.js const getBuyerById = async (buyerId) => { const query = "SELECT * FROM Buyers WHERE Buyer_ID = $1"; const { rows } = await pool.query(query, [buyerId]); return rows.length > 0 ? rows[0] : null; }; const getTransactionsByBuyerId = async (buyerId) => { const query = "SELECT * FROM Transactions WHERE Buyer_ID = $1"; const { rows } = await pool.query(query, [buyerId]); return rows; }; module.exports = { getBuyerById, getTransactionsByBuyerId };
Теперь вместо написания SQL-запросов непосредственно в каждом маршруте база кода может полагаться на эти служебные функции, что уменьшает дублирование и упрощает управление логикой.
3. Унифицированная обработка ответов: Еще одной областью улучшений стала обработка ответов. Различные маршруты имели противоречивые шаблоны отправки ответов об успехе и ошибках. Чтобы стандартизировать это, я представил служебные функции, такие как send404, send500 и sendSuccess.
Поскольку проект все еще находится на ранней стадии, я заметил некоторые недостающие маршруты, такие как POST, DELETE и PUT, которые я мог бы легко создать. Однако я решил ограничиться только тем, о чем спрашивал.
Дайте мне знать в комментариях, как вы обычно справляетесь с подобными ситуациями, чтобы вы могли внести дополнительный вклад... Вы открываете новую задачу, просто создаете ее и делаете запрос на включение? Мне бы очень хотелось прочитать ваш опыт.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3