Объект Expressrouter - это набор промежуточного программного обеспечения и маршрутов. Это мини-приложение в основном приложении.

Он может выполнять только функции промежуточного программного обеспечения и маршрутизации и не может работать самостоятельно.

Он также ведет себя как промежуточное ПО, поэтому мы можем использовать его с app.use или в качестве аргумента use метода другого маршрута.

В этой статье мы рассмотрим router методы объекта, включая all, param, а также методы для прослушивания определенных типов запросов.

Методы

router.all (путь, [обратный вызов,…] обратный вызов)

Метод router.all принимает обратный вызов для обработки всех видов запросов.

Мы можем передать постоянный путь, строку с шаблоном пути или регулярное выражение.

Например, мы можем передать промежуточное ПО, которое запускается для всех маршрутов, подключенных к router, следующим образом:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fooRouter = express.Router();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const mw1 = (req, res, next) => {
  console.log('middleware 1 called');
  next();
}
const mw2 = (req, res, next) => {
  console.log('middleware 2 called');
  next();
}
fooRouter.all('*', mw1, mw2);
fooRouter.get('/', (req, res) => {
  res.send('foo');
})
app.use('/foo', fooRouter);
app.listen(3000, () => console.log('server started'));

Тогда получаем:

middleware 1 called
middleware 2 called

если мы сделаем запрос к /foo, поскольку все, что начинается с /foo, проходит через fooRouter, и у нас есть вызов метода fooRouter.all с переданным промежуточным программным обеспечением.

Эквивалентно, мы можем написать:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fooRouter = express.Router();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const mw1 = (req, res, next) => {
  console.log('middleware 1 called');
  next();
}
const mw2 = (req, res, next) => {
  console.log('middleware 2 called');
  next();
}
fooRouter.all('*', mw1);
fooRouter.all('*', mw2);
fooRouter.get('/', (req, res) => {
  res.send('foo');
})
app.use('/foo', fooRouter);
app.listen(3000, () => console.log('server started'));

Они остаются такими же, пока порядок fooRouter.all вызывается в том же порядке, в котором передаются обратные вызовы.

router.METHOD (путь, [обратный вызов,…] обратный вызов)

router.METHOD предназначен для обработки запросов с помощью данного метода. Например, router.get для обработки запросов GET, router.post для обработки запросов POST и т. Д.

router.get также автоматически вызывает HTTP HEAD в дополнение к методу GET, если router.head не был вызван.

Мы можем предоставить несколько обратных вызовов, и все они обрабатываются одинаково. Эти обратные вызовы могут вызывать вызов next('route') для обхода оставшихся обратных вызовов маршрута.

Например, мы можем использовать его следующим образом:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fooRouter = express.Router();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
fooRouter.get('/', (req, res) => {
  res.send('foo');
})
app.use('/foo', fooRouter);
app.listen(3000, () => console.log('server started'));

Затем, когда мы делаем запрос к /foo, мы возвращаем foo.

Мы также можем передать регулярное выражение для маршрута path. Например, мы можем написать:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fooRouter = express.Router();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
fooRouter.get('/ab+c/', (req, res) => {
  res.send('foo');
})
app.use('/foo', fooRouter);
app.listen(3000, () => console.log('server started'));

для прослушивания запросов о путях /foo/abc, /foo/abbc, /foo/abbbc и т. д., поскольку мы указали в регулярном выражении, что ищем любое количество символов b в пути.

router.param (имя, обратный вызов)

router.param позволяет нам запускать callback вызов функции, когда передается конкретный параметр при запросе от клиента.

name - это имя заполнителя параметра, которое мы ищем.

Параметры функции callback:

  • req, объект запроса.
  • res, объект ответа.
  • next, указывающий на следующую функцию промежуточного программного обеспечения.
  • Значение параметра name.
  • Имя параметра.

Например, мы можем использовать его следующим образом:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fooRouter = express.Router();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
fooRouter.param('name', (req, res, next, name) => {
  req.name = name;
  next();
})
fooRouter.get('/:name', (req, res) => {
  res.send(req.name);
})
app.use('/foo', fooRouter);
app.listen(3000, () => console.log('server started'));

Затем мы делаем запрос к /foo/abc, и получаем abc, поскольку fooRouter.param обнаружил, что параметр name был передан вместе с URL-адресом.

Параметр name имеет значение 'abc', потому что он захватил часть после /foo/, а затем мы присвоили name req.name и вызвали next.

После этого вызывается обработчик маршрута, который мы передали в foorRouter.get, затем мы передали req.name в res.send и отправляли его в качестве ответа.

Заключение

Express router позволяет нам создавать вложенные приложения приложения Express, поэтому нам не нужно добавлять все обработчики маршрутов и промежуточное ПО в основное приложение.

С помощью метода all мы можем прослушивать любые запросы. Мы также можем прослушивать определенные типы запросов, такие как запросы GET или POST, с помощью соответствующих методов. Все они принимают строку или путь регулярного выражения и обратный вызов обработчика маршрута.

Наконец, у нас есть метод param для получения параметров маршрута и выполнения с ним того, что мы хотим.