Перейти к содержанию

Маршрутизация

С помощью маршрутизации описываются ответы Node.js приложения на запросы, поступающие с клиентской стороны или другого сервера (в случае, если реализуется API) на конкретный URL.

Определение маршрутов

Рассмотрим пример структуры простого REST API.

app.js

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

const host = '127.0.0.1';
const port = 7000;

app.get('/api/users', (req, res) => {...});
app.post('/api/users', (req, res) => {...});
app.put('/api/users', (req, res) => {...});
app.delete('/api/users', (req, res) => {...});

app.listen(port, host, () => console.log(`Server listens http://${host}:${port}`));

Экземпляр фреймворка Express имеет методы, совпадающие по названию с основными методами HTTP для передачи данных (get, post, put, delete) и с помощью которых формируется Node.js маршрутизация. Каждый из этих методов принимает два параметра:

  • URL, по которому будет осуществляться запрос;
  • обрабатывающую запрос функцию (принимает объект запроса и запрос ответа).

Передаваемые данные и информация об отправителе запроса содержится в объекта запроса, а с помощью объекта ответа формируется ответ на запрос.

При описании Node.js маршрутизации в URL допускается использование специальных символов. Так, символ ?, указывает на необязательность символа, за которым он следует.

// /api/user и /api/users
app.get('/api/users?', (req, res) => {...});

Если необходимо указать необязательность группы символов, оберните их в круглые скобки.

// /api/user и /api/userrs
app.get('/api/user(rs)?', (req, res) => {...});

Символ + означает, что предшествующий ему символ может повторяться в этом месте неограниченное количество раз.

// /api/users, /api/userss, /api/usersss, ...
app.get('/api/users+', (req, res) => {...});

Символ * означает, что на ее месте может быть абсолютно любая последовательность символов, не ограниченная по длине.

// /api/users, /api/clients, /api/cart, ...
app.get('/api/*', (req, res) => {...});

Также Node.js маршрутизация поддерживает при определении URL регулярные выражения.

// /api/users/1, /api/clients/2, ...
app.get(\/api\/.*s\/[0-9]+$, (req, res) => {...});

При описании Node js маршрутизации важен порядок определения маршрутов. Запрос попадает в первый подходящий обработчик и дальше поиск уже не осуществляется.

all()

Метод all() позволяет определить один обработчик на все типы HTTP запросов по заданному URL.

// GET | POST | PUT | DELETE /api/users
app.all('/api/users', (req, res) => {...});

Теперь все отправляемые на маршрут /api/users запросы (неважно, get, post или еще какой-нибудь другой) будут попадать в единый обработчик.

route()

Использование метода route() дает возможность сразу определить для одного URL обработчики для разных HTTP методов.

app.route('/api/users');
    .post((req, res) => {...})
    .put((req, res) => {...})
    .delete((req, res) => {...});

express.Router()

С помощью express.Router() можно описать Node.js маршрутизацию как систему взаимосвязанных Middleware (промежуточных обработчиков).

app.js

const routes = require('./routes')

app.use('/api', routes)

routes.js

const
    express = require("express"),
    router = express.Router();

router.route('/users')
    .get((req, res) => {...})
    .post((req, res) => {...})
    .put((req, res) => {...})
    .delete((req, res) => {...});

module.exports = router;

Node.js express.Router() позволяет создавать составные модульные маршруты без повторного указания повторяющихся частей URL.

В текущей статье рассказано про определение маршрутов в Node.js приложении, а про саму обработку получаемых запросов подробно можно узнать в статьях Объект запроса и Объект ответа.