Керівництво з обробки винятків у Express PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Керівництво з обробки винятків у Express

Вступ

Під час взаємодії користувачів із будь-якою програмою обов’язково виникатимуть винятки та помилки, інженери програмного забезпечення мають вибирати засоби обробки будь-якої помилки, яка може виникнути – свідомо чи несвідомо. У результаті розробники серверних програм, які створюють API за допомогою Express, працюють над тим, щоб створити корисний, ефективний і зручний API. Найважливішим є поводження з помилками таким чином, щоб створити надійну систему, оскільки це допомагає скоротити час розробки, явні помилки, проблеми з продуктивністю та визначає успіх або масштабованість розробки програмного забезпечення.

Вам потрібно зареєструвати повідомлення про помилку, придушити помилку, повідомити користувачів про помилку чи написати код для обробки помилок? Більше не дивуйтеся.

У цьому посібнику ми навчимося створювати надійну кодову базу обробки помилок для програм Express, яка допомагатиме виявляти помилки програми та вживати оптимальних дій для відновлення будь-якої програми після помилкового виходу з ладу під час виконання.

Примітка: Ми будемо використовувати Postman для тестування API в нашій демонстрації. Ви можете завантажити його на Листоноша Сторінка завантаження. Крім того, ви можете просто використовувати браузер, командний рядок curl або будь-який інший інструмент, з яким ви можете бути знайомі.

Що таке обробка помилок?

У розробці програмного забезпечення є два різні види винятків: оперативний та програмний.

  • Операційні збої можуть виникати під час виконання, і щоб запобігти раптовому завершенню роботи програми, ми повинні витончено обробляти ці винятки за допомогою ефективних методів обробки помилок.
  • Програмні винятки створюються програмістом вручну, коли виникає винятковий стан.

Операційні винятки можна розглядати як «несподівані, але передбачені» винятки (наприклад, доступ до індексу поза межами), а програмні винятки — як «очікувані та передбачені» винятки (наприклад, виняток форматування числа).

Обробка винятків — це процедура, яка використовується для пошуку та усунення недоліків у програмі. Обробка помилок надсилає повідомлення, які містять тип помилки, що сталася, і стек, де сталася помилка.

Примітка: У інформатиці винятки можна відновити, і зазвичай виникають через операційні чи програмні проблеми під час виконання. Зазвичай помилки виникають із-за зовнішніх факторів, таких як апаратні обмеження, проблеми з підключенням, брак пам’яті тощо. У JavaScript терміни часто використовуються як синоніми, а спеціальні винятки походять із Error клас. Error сам клас представляє як помилки, так і винятки.

У Express обробка винятків стосується того, як Express налаштовується на перелов і обробку синхронних і асинхронних винятків. Хороша річ обробки винятків у Express полягає в тому, що як розробнику вам не потрібно писати власні обробники винятків; Express поставляється з обробником винятків за замовчуванням. Обробник винятків допомагає виявити помилки та повідомити про них користувачеві. Він також надає різні стратегії виправлення та реалізує їх для пом’якшення винятків.

Хоча може здатися, що під капотом багато речей, обробка винятків у Express не сповільнює загальний процес програми та не призупиняє її виконання.

Розуміння обробки винятків у Express

З обробником помилок за замовчуванням, який постачається з Express, у нас є набір функцій проміжного програмного забезпечення, які допомагають автоматично виявляти помилки в обробниках маршрутів. Незабаром ми створимо проект, щоб застосувати теорію на практиці про те, як повертати правильні помилки в програмі Express і як уникнути витоку конфіденційної інформації.

Визначення функції проміжного програмного забезпечення в Express

Функції проміжного програмного забезпечення обробки помилок визначені таким чином, що вони приймають Error об'єкт як перший вхідний параметр, а потім параметри за замовчуванням будь-якої іншої функції проміжного програмного забезпечення: request, response та next, next() функція пропускає все поточне проміжне програмне забезпечення до наступного обробника помилок для маршрутизатора.

Налаштування обробки помилок у Express

Виконайте таку команду в терміналі, щоб створити програму Node and Express:

$ mkdir error-handling-express

У щойно створеній папці давайте ініціалізуємо новий проект Node:

$ cd error-handling-express && npm init -y

Це створює package.json файл у нашій папці.

Щоб створити сервер Express у нашій програмі Node, нам потрібно встановити express пакет, dotenv для автоматичного завантаження змінних середовища .env файл в process.env об'єкт і nodemon для перезапуску програми вузла, якщо в каталозі помічено зміну файлу.

$ npm install express dotenv nodemon

Далі створіть app.js файл у папці проекту, який слугуватиме файлом індексу для програми.

Тепер, коли ми встановили всі необхідні залежності для нашої програми Express, нам потрібно налаштувати сценарій для читання програми в package.json файл. Щоб досягти цього, package.json файл, так що scripts об'єкт виглядає як показано нижче:

"scripts": {
    "start": "nodemon app.js"
},

Крім того, ви можете пропустити використання nodemon, і використовувати node app.js замість цього.

Налаштування експрес-сервера

Щоб налаштувати сервер, нам потрібно спочатку імпортувати різні пакети app.js. Ми також створимо a .env файл у каталозі проекту – для зберігання всіх змінних середовища для програми:



const express = require('express')
require('dotenv').config

PORT=4000 

Ми визначили номер порту для програми в .env, який завантажується та читається dotenv, і до нього можна буде отримати доступ пізніше.

Ініціалізація Express Server

Тепер нам потрібно ініціалізувати Express-сервер і змусити нашу програму слухати номер порту програми разом із запитом на тестовий маршрут – /test. Давайте оновити app.js, під операторами імпорту:


const app = express();
const port = process.env.PORT || 4000;

app.get("/test", async (req, res) => {
    return res.status(200).json({ success: true });
});

app.listen(port, () => {
    console.log(`Server is running at port ${port}`);
});

З цього моменту ми навчимося обробляти різні випадки використання операційних помилок, які можуть виникнути в Express.

Обробка помилок «Не знайдено» в Express

Припустімо, що вам потрібно отримати всіх користувачів із бази даних користувачів, ви можете ефективно впоратися зі сценарієм потенційної помилки, коли в базі даних немає даних, загорнувши логіку в try/catch блокувати – сподіваючись виявити будь-яку помилку, яка може спроектуватися в catch блок:


const getUser = () => undefined;

app.get("/get-user", async (req, res) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error('User not found');
		}
	} catch (error) {
	    
		console.log(error); 
		
		res.status(400).send(error.message) 
	}
	return res.status(200).json({
		success: true
	});
});

Це призводить до:

User not found

Тепер, коли цей запит зроблено (ви можете перевірити за допомогою Postman), а в базі даних немає користувача, клієнт отримує повідомлення про помилку «Користувача не знайдено». Крім того, ви помітите, що помилка також реєструється в консолі.

Оптимізація обробки помилок за допомогою проміжного програмного забезпечення Error Handler

Ми можемо оптимізувати розробку, створивши проміжне програмне забезпечення обробника помилок, яке надходитиме в кінці всіх визначених маршрутів, тож якщо в одному з маршрутів виникне помилка, Express автоматично перегляне наступне проміжне програмне забезпечення та продовжуватиме рух вниз за списком поки не досягне обробника помилок. Обробник помилок обробить помилку, а також надішле відповідь клієнту.

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Для початку створіть папку під назвою middleware у каталозі проекту, а в цій папці створіть файл під назвою errorHandler.js який визначає обробник помилок:

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

У нашій функції проміжного програмного забезпечення ми повідомили Express, що це не базова функція проміжного програмного забезпечення, а обробник помилок, додавши error параметр перед 3 основними параметрами.

Тепер ми використаємо обробник помилок у нашій демонстрації app.js і обробіть початкову помилку отримання користувачів за допомогою проміжного програмного забезпечення обробника помилок, як показано нижче:


const getUser = () => undefined;

app.get("/get-user", async (req, res, next) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
	} catch (error) {
		return next(error);
	}
});

app.use(errorHandler);

Ми можемо ще більше оптимізувати наш код, створивши абстракцію навколо try/catch логіка. Ми можемо досягти цього, створивши нову папку в каталозі проекту під назвою utils, а в ньому створіть файл під назвою tryCatch.js.

Щоб абстрагувати try-catch логіка – ми можемо визначити функцію, яка приймає іншу функцію (відому як контролер) як його параметр і повертає an async функція, яка буде зберігати a try/catch для будь-якого отриманого контролера.

Якщо в контролері виникає помилка, вона фіксується в catch блок і викликається наступна функція:


const tryCatch = (controller) => async (req, res, next) => {
	try {
		await controller(req, res);
	} catch (error) {
		return next(error);
	}
};
module.exports = tryCatch;

З try/catch абстракції, ми можемо змінити наш код, щоб зробити його більш стислим, пропустивши try-catch явно під час отримання користувачів у app.js:


const getUser = () => undefined;

app.get(
	"/get-user",
	tryCatch(async (req, res) => {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
		res.status(400).send(error.message);
	})
);

Ми успішно абстрагувалися від логіки try-catch, і наш код все ще працює, як і раніше.

Обробка помилок перевірки в Express

Для цієї демонстрації ми створимо новий маршрут у нашій програмі Express для входу – для підтвердження ідентифікатора користувача під час входу. Спочатку ми встановимо joi пакет, щоб допомогти зі створенням схеми, за допомогою якої ми можемо забезпечити виконання вимог:

$ npm i joi

Далі створіть схему, яка є a Joi.object з userId яке має бути числом і є обов’язковим – це означає, що запит має відповідати об’єкту з ідентифікатором користувача.

Ми можемо використовувати validate() метод в об’єкті схеми для перевірки кожного введення щодо схеми:


const schema = Joi.object({
	userId: Joi.number().required(),
});

app.post(
	"/login",
	tryCatch(async (req, res) => {
		const {error, value} = schema.validate({});
		if (error) throw error;
	})
);

Якщо порожній об'єкт передається в validate() метод, помилка буде витончено оброблена, і повідомлення про помилку буде надіслано клієнту:

На консолі ми також отримуємо доступ до a details масив, який містить різні відомості про помилку, які можна повідомити користувачеві, якщо це необхідно.

Щоб спеціально обробляти помилки перевірки таким чином, щоб передати відповідні деталі помилки для кожної помилки перевірки, проміжне програмне забезпечення обробника помилок може бути реорганизовано:


const errorHandler = (error, req, res, next) => {
	console.log(error); 

	if (error.name === "ValidationError") {
		return res.status(400).send({
			type: "ValidationError",
			details: error.details,
		});
	}

	res.status(400).send(error.message); 
};

module.exports = errorHandler;

з errorHandler.js тепер налаштовано, коли ми робимо той самий запит із порожнім об’єктом, переданим у validate() метод:

Керівництво з обробки винятків у Express PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Тепер ми маємо доступ до налаштованого об’єкта, який повертає повідомлення більш зрозумілим/зручнішим способом. Таким чином ми можемо надсилати та обробляти різні типи помилок залежно від типу надходження помилки.

Висновок

У цьому посібнику ми розглянули кожен аспект обробки помилок Express.js, зокрема те, як синхронний і асинхронний код обробляється за замовчуванням, як створювати власні класи помилок, як писати спеціальні функції проміжного програмного забезпечення для обробки помилок і надавати next як остаточний обробник улову

Як і у випадку з будь-яким іншим завданням, під час розробки існують найкращі практики, які включають ефективну обробку помилок, і сьогодні ми дізналися, як надійно обробляти помилки в програмі Express.

Правильна обробка помилок означає не лише скорочення часу розробки шляхом легкого пошуку вад і помилок, але й розробку надійної кодової бази для великомасштабних програм. У цьому посібнику ми побачили, як налаштувати проміжне програмне забезпечення для обробки операційних помилок. Деякі інші способи покращити обробку помилок включають: не надсилати трасування стека, витончено зупиняти процеси для обробки неперехоплених винятків, надсилати відповідні повідомлення про помилки, надсилати журнали помилок і налаштовувати клас, який розширює Error клас.

Сподіваюся, приклади, які я використав у цьому підручнику, були для вас приємними. Я розглянув різні сценарії, з якими ви потенційно можете зіткнутися під час написання програми Express для використання в реальному світі щодо керування помилками. Будь ласка, дайте мені знати, якщо я щось пропустив. Це принесе нам користь і допоможе мені дізнатися більше. Гарного дня і дякую за читання.

Ви можете посилатися на весь вихідний код, використаний у статті Github.

Додаткові ресурси

Часова мітка:

Більше від Stackabuse