5 кращих способів обробки помилок у Node.js

pic

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. Використання Middleware для обробки помилок в Express

Якщо ви створюєте API або веб-сервер за допомогою Express, middleware — це найкращий спосіб обробляти помилки послідовно. Ви можете централізувати вашу логіку обробки помилок, а не повторювати її в кожному маршруті.

Приклад:

const express = require('express');  
const app = express();  

// Користувацький middleware для помилок  
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("Щось пішло не так!");  
});  

// Catch-all middleware для помилок  
app.use((err, req, res, next) => {  
 res.status(500).send('Внутрішня помилка сервера');  
});  

app.listen(3000, () => console.log("Сервер працює на порту 3000"));

Чому це важливо:

  • Чиста, повторно використовувана логіка для консистентних відповідей.
  • Зберігає маршрути простими та орієнтованими на бізнес-логіку.

5. Бібліотеки для структурованої обробки помилок

Іноді трохи допомоги з бібліотеки може зробити велику різницю.
Бібліотеки, такі як Boom або http-errors, спрощують створення помилок і стандартизують відповіді.

Приклад з 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: "An unexpected error occurred" });  
 }  
});

Чому це важливо:

  • Зменшує обсяг повторюваного коду для поширених сценаріїв помилок.
  • Забезпечує структуру для консистентних відповідей API.

Декілька додаткових порад:

  • Завжди записуйте помилки: Використовуйте інструменти, такі як Winston або Pino, щоб ефективно керувати логами.
  • Не зловживайте try-catch: Використовуйте його там, де помилки очікуються, а не скрізь.
  • Тестуйте шляхи обробки помилок: Симулюйте збої під час розробки, щоб перевірити, як ваша обробка помилок витримує навантаження.
  • Моніторинг за допомогою APM інструментів: Інтегруйте рішення для моніторингу, такі як New Relic або Sentry, щоб відслідковувати помилки в продакшн середовищі.

Підсумки

Обробка помилок у Node.js — це не лише уникнення аварій додатка, але й побудова систем, які передбачувані, надійні та легкі в обслуговуванні. Застосовуючи ці п'ять технік, ви можете тримати помилки під контролем і покращити досвід користувачів.

Можливо, вам буде цікаво:

1) Як оптимізувати продуктивність вебсайту?

2) Змініть свої програмні звички до 2025 року: Моя подорож через 10 ВИКЛИКІВ

3) Інтерв'ю питання для старшого рівня: JavaScript Promise

4) Що таке індексація бази даних і чому це важливо?

5) Чи може AI змінити ландшафт трейдингу?

Читати більше блогів з тут

Поділіться своїми враженнями в коментарях і давайте обговоримо, як вирішити ці проблеми!

Слідкуйте за мною на Linkedin

Перекладено з: 5 Top Ways to Handle Errors in Node.js

Leave a Reply

Your email address will not be published. Required fields are marked *