5 найкращих способів обробляти помилки в Node.js
Обробка помилок — це не найгламурніша частина програмування, але коли йдеться про створення надійних, готових до виробництва додатків на Node.js, це абсолютно необхідно. Погано оброблена помилка може призвести до аварії вашого додатка, виявлення вразливостей або негативних відгуків від користувачів — і жоден з цих варіантів не є бажаним.
1. Класичний Try-Catch для синхронного коду
Для синхронних операцій у Node.js конструкція try-catch
є вашим основним інструментом. Вона дозволяє перехоплювати помилки контрольованим чином, запобігаючи аваріям вашого додатка.
Приклад:
const fs = require('fs');
function readJSONFile(filePath) {
try {
const data = fs.readFileSync(filePath, 'utf8');
return JSON.parse(data);
} catch (error) {
console.error("Помилка при читанні або парсингу файлу:", error.message);
throw new Error("Невірні дані JSON"); // Перенаправляємо помилку, щоб обробник міг її опрацювати.
}
}
Чому це важливо:
- Це дозволяє елегантно обробляти помилки, утримуючи додаток у робочому стані.
- Спрощує налагодження, оскільки ви можете записати та відслідковувати проблему.
Порада: Завжди записуйте помилки, щоб мати більше контексту під час налагодження.
2. Async/Await: Обгортання асинхронного коду в Try-Catch
Працюєте з синтаксисом async/await
у Node.js? Помилки можуть з'явитися і тут. Обгортання вашого коду в try-catch
гарантує, що ці помилки будуть перехоплені та оброблені.
Приклад:
const axios = require('axios');
async function fetchData(url) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error("Помилка при отриманні даних:", error.message);
throw new Error("Не вдалося отримати дані, спробуйте ще раз.");
}
}
Чому це важливо:
- Це робить асинхронний код більш читабельним та зручним для налагодження.
- Утримує ваш додаток стійким, навіть коли зовнішні сервіси не працюють.
3. Глобальні обробники помилок за допомогою Event Emitters
Node.js має механізм process.on
для обробки глобальних помилок, таких як необроблені відхилення або несподівані винятки. Використовуйте це як вашу мережу безпеки, щоб ваш додаток не виходив з ладу без попередження.
Приклад:
process.on('uncaughtException', (error) => {
console.error("Необроблений виняток:", error.message);
// Записуємо помилку, очищуємо ресурси і виходимо, якщо потрібно.
process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
console.error("Необроблене відхилення на:", promise, "причина:", reason);
});
Чому це важливо:
- Запобігає аваріям додатка через непередбачувані проблеми.
- Додає останній шар моніторингу помилок.
Попередження: Використовуйте це обережно. Залежність від глобальних обробників може приховувати глибші проблеми.
4. Використання проміжного програмного забезпечення для обробки помилок в Express
Якщо ви створюєте API або веб-сервер за допомогою Express, проміжне програмне забезпечення — це найчистіший спосіб обробляти помилки послідовно. Ви можете централізувати вашу логіку обробки помилок, замість того, щоб повторювати її всюди.
Приклад:
const express = require('express');
const app = express();
// Користувацьке проміжне програмне забезпечення для помилок
app.use((err, req, res, next) => {
console.error("Сталася помилка:", err.message);
res.status(err.status || 500).json({ error: err.message });
});
// Приклад маршруту
app.get('/', (req, res) => {
throw new Error("Щось пішло не так!");
});
// Обробник для всіх помилок
app.use((err, req, res, next) => {
res.status(500).send('Внутрішня помилка сервера');
});
app.listen(3000, () => console.log("Сервер працює на порту 3000"));
Чому це важливо:
- Чиста, повторно використовувана логіка для послідовних відповідей.
- Зберігає ваші маршрути простими та зосередженими на бізнес-логіці.
5. Бібліотеки для структурованої обробки помилок
Іноді трохи допомоги від бібліотеки може значно спростити процес.
Приклад з Boom:
const Boom = require('@hapi/boom');
// Створення та викидання помилки
function fetchUser(id) {
if (!id) {
throw Boom.badRequest("User ID is required.");
}
// Логіка отримання
}
// Обробка помилок в Express
app.use((err, req, res, next) => {
if (Boom.isBoom(err)) {
res.status(err.output.statusCode).json(err.output.payload);
} else {
res.status(500).json({ message: "Сталася несподівана помилка" });
}
});
Чому це важливо:
- Зменшує обсяг коду для поширених сценаріїв помилок.
- Забезпечує структуру для послідовних відповідей API.
Кілька додаткових порад:
- Завжди записуйте помилки: Використовуйте інструменти, такі як Winston або Pino, щоб ефективно управляти логами.
- Не зловживайте try-catch: Використовуйте його там, де очікуються помилки, а не всюди.
- Тестуйте ваші шляхи обробки помилок: Моделюйте збої під час розробки, щоб перевірити, як ваша обробка помилок справляється.
- Моніторьте за допомогою інструментів APM: Інтегруйте рішення для моніторингу, такі як New Relic або Sentry, щоб ловити помилки на виробництві.
Підсумок
Обробка помилок у Node.js — це не лише про запобігання аваріям додатка, це також про створення систем, які передбачувані, надійні та прості в обслуговуванні. Використовуючи ці п’ять технік, ви можете залишатися на вершині помилок і забезпечити плавний досвід користувачів.
Вам також може бути цікаво:
1) Як оптимізувати продуктивність вебсайту?
2) Змініть свої звички програмування до 2025 року: Моя подорож з 10 ВИКЛИКІВ
3) Питання на співбесіду для старшого рівня JavaScript Promise
4) Що таке індексація бази даних і чому це важливо?
5) Чи може ШІ змінити ландшафт торгівлі?
Читайте більше блогів тут Here
Поділіться своїми враження
Перекладено з: “Boost Your ReactJS Projects: Essential Libraries for Seamless Integration”