Express.js – це фреймворк для Node.js, що надає набір функцій для створення веб- і мобільних додатків. Express.js заснований на стандартних API Node.js, що робить його простим у вивченні та використанні.
Історія Express.js почалася з прагнення створити гнучкий фреймворк для Node.js, який би став стандартом розробки веб-додатків. TJ Holowaychuk, автор фреймворку, надихнувся каркасом Sinatra, написаним мовою Ruby. Він прагнув зберегти мінімалізм, але при цьому забезпечити можливість підключення безлічі плагінів.
Відтоді він став одним із найпопулярніших веб-фреймворків для Node.js (його в обов’язковому порядку вивчають студенти курсу NODE.JS від компанії FoxmindED).
Сьогодні Express.js є невід’ємною частиною екосистеми Node.js і продовжує залишатися одним із найпопулярніших виборів для розроблення серверної частини веб-додатків.
Основні особливості
Express.js надає безліч функцій для розробки веб-додатків, включно з ними:
- Маршрутизація.
- Підтримка шаблонів: інтеграція з різними шаблонізаторами (Jade, Handlebars і EJS).
- Підтримка баз даних: фреймворк легко інтегрується з різними базами даних (MongoDB, PostgreSQL і MySQL).
- Підтримка тестування.
Express.js надає прості та ефективні механізми обробки різних HTTP-методів. Розглянемо як приклад маршрути для оновлення (PUT) і видалення (DELETE) користувачів:
// Update user with specified ID
app.put('/users/:id', (req, res) => {
// User update logic
res.send('User updated successfully');
});
// Deleting a user with the specified ID
app.delete('/users/:id', (req, res) => {
// Logic for deleting a user
res.send('User deleted successfully');
});
Проміжне ПЗ в Express.js виконує завдання перед або після обробки HTTP-запитів. Ось приклад використання middleware для перевірки авторизації користувача:
const authMiddleware = (req, res, next) => {
if (!req.user) {
res.status(401).send('Not authorized');
return;
}
next();
};
// Applying middleware to a route
app.use('/secure-route', authMiddleware);
Цей код демонструє додавання проміжного програмного забезпечення, яке перевіряє, чи авторизований користувач, до певного маршруту.
Встановлення та налаштування
- Для встановлення Express.js виконайте в терміналі: npm install express
Ця команда встановлює фреймворк у глобальний простір імен Node.js.
- Щоб створити перший додаток, створіть новий каталог і файл index.js. Вставте наступний код:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(3000);
Так створюється простий застосунок, що відповідає на всі HTTP-запити до кореневого маршруту (/) рядком “Hello, world!”.
- Для запуску програми в терміналі виконайте: node index.js
Додаток буде доступний за адресою http://localhost:3000 у вашому браузері.
Додаток Express.js зазвичай складається з таких компонентів:
- index.js: запускає додаток і обробляє HTTP-запити.
- Маршрути: визначають обробку HTTP-запитів.
- Проміжне ПЗ: виконується перед або після обробки HTTP-запитів.
- Шаблони: використовуються для генерації HTML-коду.
Маршрутизація
В Express.js маршрутизація базується на шаблонах URL-адрес. Для створення маршруту використовується метод route() об’єкта app. Наприклад, наступний код створює маршрут для обробки HTTP-запитів до /users/:id:
app.get('/users/:id', (req, res) => {
// Request processing logic
});
У цьому прикладі маршрут використовує шаблон URL-адреси /users/:id, де :id – це змінна, що містить ідентифікатор користувача.
Express.js надає також методи маршрутизації, такі як post(), put() і delete(). Вони використовуються для обробки HTTP-запитів із відповідними методами.
Наведемо приклад створення маршруту:
- Обробка HTTP-запитів до кореневого маршруту:
app.get('/', (req, res) => {
res.send('Hello, world!');
});
- Обробка HTTP-запитів до маршруту /users:
app.get('/users', (req, res) => {
// Request processing logic
});
app.post('/users', (req, res) => {
// Request processing logic
});
app.put('/users/:id', (req, res) => {
// User update logic
});
app.delete('/users/:id', (req, res) => {
// Logic for deleting a user
});
Управління маршрутами можна здійснювати за допомогою таких методів:
- use(): додає маршрут у кінець ланцюжка маршрутів.
- useBefore(): додає маршрут на початок ланцюжка.
- delete(): видаляє маршрут із ланцюжка маршрутів.
Приклад:
app.get('/', (req, res) => {
// Request processing logic
});
// Adding a route to the end of the route chain
app.use('/users', (req, res) => {
// Request processing logic
});
Робота з проміжним програмним забезпеченням (Middleware)
Middleware являє собою функцію, що виконується перед або після обробки HTTP-запиту. В Express.js його можна застосовувати за допомогою методу use() об’єкта app. Для прикладу, додамо middleware для перевірки авторизації користувача:
const authMiddleware = (req, res, next) => {
if (!req.user) {
res.status(401).send('Not authorized');
return;
}
next();
};
app.use(authMiddleware);
Цей приклад показує, як middleware отримує об’єкти req і res, а також функцію next(), що передає управління наступному middleware або функції обробки маршруту.
Ви можете створювати власні middleware для виконання завдань, які не вирішуються вбудованими. Наприклад:
const customMiddleware = (req, res, next) => {
// Your logic middleware
next();
};
app.use(customMiddleware);
Express.js також має велику екосистему сторонніх бібліотек middleware:
- шолом: захищає додаток від атак.
- morgan: запис журналу HTTP-запитів.
- cors: підтримка CORS у додатках Express.js.
Створення API
RESTful API, що відповідає принципам REST, використовує прості HTTP-методи для операцій над ресурсами. Для створення такого API з Express.js потрібно:
- Визначити ресурси (користувачі, продукти, замовлення тощо).
- Визначити операції (створення, читання, оновлення, видалення).
- Створіть маршрути (для кожного ресурсу створіть маршрут, що обробляє запити).
- Обробіть запити (використовуйте функції маршрутизації Express.js для обробки запитів).
- Надішліть відповіді (використовуйте методи res.send() або res.json().
Приклад використання Express.js для надсилання відповіді:
Для обробки GET-запиту використовується метод req.query для отримання параметрів запиту. Наприклад, код нижче обробляє GET-запит до маршруту /users, повертаючи список користувачів:
app.get('/users', (req, res) => {
// Get list of users
const users = [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' },
];
// Send reply
res.json(users);
});
Цей приклад використовує Express.js для опрацювання запиту та надсилання відповіді у форматі JSON з масивом користувачів.
Безпека та продуктивність
Безпека — це важливий аспект будь-якого веб-додатка. Express.js не є винятком. Пропонуємо кілька порад для цього:
- Використовуйте протокол HTTPS: він шифрує дані, що передаються між клієнтом і сервером. Це допомагає захистити дані від перехоплення.
- Завжди встановлюйте актуальні оновлення, щоб захистити свій додаток від останніх загроз.
- Існує безліч бібліотек middleware, які можуть допомогти захистити ваш додаток від атак. Наприклад, бібліотека helmet надає набір функцій для захисту від загальних атак, таких як XSS і SQL-ін’єкції.
- Регулярно проводьте тестування безпеки свого застосунку, щоб виявити будь-які потенційні вразливості.
Щоб оптимізувати продуктивність додатків, пропонуємо використовувати такі методи:
- Кешування. Воно може допомогти прискорити роботу вашої програми, зберігаючи результати часто використовуваних операцій у пам’яті.
- Запити до бази даних. Чим їх буде менше виконуватися вашим додатком, тим швидше він працюватиме.
- Оптимізовані алгоритми. Вибирайте їх для виконання завдань, таких як сортування і пошук.
- Оптимізуйте код. Проведіть аналіз коду вашого застосунку, щоб знайти місця, де можна внести поліпшення продуктивності.
Інтеграція з базами даних
Express.js забезпечує просту інтеграцію з різними базами даних через використання відповідних драйверів. Ось кілька прикладів:
- MongoDB: Mongoose
- PostgreSQL: knex.js
- MySQL: mysql2
- SQLite: sqlite3
Щоб інтегрувати Express.js з базою даних, виконайте такі кроки:
- Встановіть драйвер бази даних: npm install <driver_name>
- Ініціалізуйте підключення до бази даних:
const database = new <driver_name>({
// Database Connection Options
});
- Використовуйте драйвер для операцій над базою даних:
//Examples of database operations
const user = await database.collection('users').insertOne({ name: 'John Doe', age: 30 });
const user = await database.collection('users').findOne({ id: 1 });
await database.collection('users').updateOne({ id: 1 }, { age: 31 });
await database.collection('users').deleteOne({ id: 1 });
А тепер розглянемо приклади простого налаштування і використання баз даних MongoDB і PostgreSQL у додатках на Express.js:
- MongoDB:
const MongoClient = require('mongodb').MongoClient;
const database = new MongoClient('mongodb://localhost:27017/my-database');
// An example of creating an entry in the users collection
database.connect((err) => {
if (err) {
console.error(err);
return;
}
const user = { name: 'John Doe', age: 30 };
database.collection('users').insertOne(user, (err, result) => {
if (err) {
console.error(err);
return;
}
console.log('Entry created successfully');
});
});
- PostgreSQL:
const knex = require('knex');
const database = knex({
connection: {
host: 'localhost',
port: 5432,
database: 'my-database',
user: 'postgres',
password: 'secret',
},
});
// Example of creating a record in the users table
database('users').insert({ name: 'John Doe', age: 30 }).then((result) => {
console.log('Запис успішно створено');
});
Тестування та налагодження додатків
Існує безліч методів тестування додатків на Express.js, які ви можете використовувати:
- Одиничне тестування:
- фокус на перевірці окремих одиниць коду;
- ефективний для виявлення помилок у конкретних частинах коду.
- Інтеграційне тестування:
- фокус на перевірці взаємодії між різними одиницями коду;
- гарантує правильну взаємодію різних частин програми.
- Системне тестування:
- фокус на перевірці всього додатка загалом;
- гарантує, що додаток працює очікуваним чином у реальних умовах.
Ось деякі з найпоширеніших інструментів налагодження (процес пошуку та усунення помилок у коді) для додатків на Express.js:
- Node Inspector – вбудований інструмент налагодження.
- Chrome DevTools – набір інструментів для налагодження веб-додатків, включно з Express.js.
Які практики найчастіше використовують у процесі налагодження?
- Точки зупинки:
- призупинення виконання коду в конкретних місцях;
- перевірка значень змінних і покрокове виконання коду.
- Перегляд значення змінних:
- інструменти налагодження для перегляду значень змінних;
- перевірка відповідності значень очікуванням.
- Виконання коду крок за кроком:
- використання інструментів налагодження для покрокового виконання коду;
- відстеження процесу виконання коду.
Висновок
Express.js надає безліч переваг у розробці веб-додатків, починаючи від простоти використання до потужних можливостей маршрутизації та middleware. Рекомендуємо глибше вивчити можливості фреймворка, щоб повністю освоїти його потенціал і поліпшити процес розробки.
Залишилися запитання щодо фреймворку Express.js? Запитуй у коментарях нижче!