Перейти до основного вмісту

Введення у Express

Express - це мінімалістичний та гнучкий веб-фреймворк для програм Node.js, що надає широкий набір функцій для мобільних та веб-додатків. Він має у своєму розпорядженні безліч службових методів HTTP та проміжних обробників, щоб створити надійний API або веб-сайт.

Давайте відразу приступимо до практики. Створіть каталог для своєї програми та зробіть його своїм робочим каталогом.

$ mkdir myapp
$ cd myapp

За допомогою команди

$ npm init -y

створіть файл package.json для своєї програми. Тепер встановіть Express у каталогу myapp і збережіть його у списку залежностей. Наприклад:

$ npm install express

У каталозі myapp створіть файл з ім'ям app.js та додайте наступний код:

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

app.get('/', (req, res) => {
res.send('Hello World!');
});

app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});

Програма запускає сервер та слухає з'єднання на порті 3000 командою.

$ node app.js

Додаток видає відповідь “Hello World!” у браузері на запити, адресовані кореневому URL (/) або маршруту. Для всіх інших шляхів відповіддю буде статус 404 - Not Found. Для обробки запитів, маршрутів, у Express визначено ряд вбудованих функцій. Маршрутизація визначає, як ваш додаток відповідає на клієнтський запит до конкретної адреси – URL. Кожен маршрут може мати одну або більше функцій обробки, що виконуються при зіставленні маршруту. Визначення маршруту, згідно з документацією, має таку структуру:

app.METHOD(PATH, HANDLER)

Де:
app — це екземпляр express програми.
METHOD -— метод запиту HTTP (GET, POST, PUT, PATCH, DELETE).
PATH —- шлях на сервері, у нашому випадку це корінь сайту '/'.
HANDLER —- функція, що виконується при зіставленні маршруту.

Давайте коротко визначимо для чого використовуються кожен з HTTP дієслів:

  • GET запитує уявлення ресурсу. Запити з використанням цього методу можуть лише витягувати дані.

  • POST використовується для надсилання сутностей до певного ресурсу. Часто викликає зміну стану або якісь побічні ефекти на сервері.

  • PUT замінює всі поточні уявлення ресурсу даними запиту.

  • DELETE видаляє вказаний ресурс.

  • PATCH використовується для часткової зміни ресурсу.

    Ми ще повернемося до дієслів, коли будемо розглядати створення REST API

У нашому випадку функція HANDLER приймає два параметри, об'єкт запиту req і об'єкт відповіді res.

(req, res) => {
res.send('Hello World!');
};

Для запуску сервера викликається метод app.listen(), до якого передається номер порту. Програма видає відповідь "Hello World!" на запити, адресовані кореневому URL (/) або маршрут. Для всіх інших шляхів, наприклад, http://localhost:3000/contact, відповіддю буде

Cannot GET /contact

Треба зауважити, що req (запит) та res (відповідь) є аналогічними об'єктами, з якими ми працювали, коли розглядали простий веб-сервер Node.js.

Додамо обробник маршруту contact

app.get('/contact', (req, res) => {
res.send('<h1>Contact page</h1>');
});

І тепер дорогою http://localhost:3000/contactсервер нам буде повертати сторінку із заголовком Contact page.

примітка

Не забувайте перезапустити сервер, щоб побачити зміни у коді.

Як вже говорилося, коли надходить запит, Express зіставляє запитану адресу з кожним із маршрутів. При збігу маршруту викликається його функція обробник. Але визначення маршрутів, крім простих рядків, можуть також містити регулярні вирази чи спеціальні символи підстановок. Зокрема, ми можемо використовувати такі символи, як ?, +, * и ().

Символ ? у маршруті вказує, що попередній символ може зустрічатися 1 раз або відсутній. Наведений нижче шлях маршруту зіставляє cotact та contact.

app.get('/con?tact', (req, res) => {
res.send('<h1>Contact page</h1>');
});

Символ + вказує, що попередній символ може зустрічатися 1 і більше разів. Цей шлях маршруту зіставляє contact, conntact, connntact і т.д.

app.get('/con+tact', (req, res) => {
res.send('<h1>Contact page</h1>');
});

Символ зірочка * вказує, що на місці цього символу може бути будь-яка кількість символів. Цей шлях маршруту зіставляє contact, conxtact, con123tact і т.д.

app.get('/con*tact', (req, res) => {
res.send('<h1>Contact page</h1>');
});

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