Объект 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
для получения параметров маршрута и выполнения с ним того, что мы хотим.