Экспресс путаница промежуточного программного обеспечения - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть такое приложение:

import express from 'express';

const middleware = tag => (req, res, next) => {
  console.log('middleware ' + tag);
  next();
};

const app = express();

const router = express.Router();

router.use(middleware('a'));

router.get('/x', (req, res) => res.json({ message: 'x' }));

app.use(router);

app.use(middleware('b'));

app.get('/y', (req, res) => res.json({ message: 'y' }));

app.use(middleware('c'));

app.listen(3000);

Однако Router ведет себя не так, как я ожидал:

$ curl localhost:3000/x

промежуточное ПО

$ curl localhost:3000/y

промежуточное ПО

промежуточное ПО b

Почему нажатие /y вызывает промежуточное ПО? Я думал, что промежуточное программное обеспечение было применено только к router.

Как применить промежуточное ПО только к router, а не к другим маршрутам в app?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Когда вы делаете

app.use(router);

вы монтируете роутер по корневому / пути вашего приложения. Промежуточное программное обеспечение маршрутизатора

router.use(middleware('a'));

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

Как применить промежуточное ПО только к маршрутизатору, а не к другим маршрутам в приложении?

Вы можете смонтировать маршрутизатор на /x и сделать роутер / его корневым путем:

router.get('/', (req, res) => res.json({ message: 'x' }));
app.use('/x', router);
0 голосов
/ 27 апреля 2018

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

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

  1. Подпуть конечных точек к чему-то вроде /feature1/x и /feature2/y. Присоедините промежуточное программное обеспечение к /feature1 и /feature2 соответственно. Это даст вам желаемый результат. Это можно сделать, подключив маршрутизатор к конечной точке /x следующим образом:

    app.use('/feature1', router);

Что означало бы, что теперь у вас есть конечные точки /feature1/x и /y. Каждый запускающий это отдельная цепочка промежуточного программного обеспечения.

  1. Подключите промежуточное программное обеспечение к определенной конечной точке, например:

    app.get('/x, middleware('a'), (req, res) => res.json({message: 'x'});
    app.get('/y', middleware('b'), (req, res) => res.json({message: 'y'});
    

На данный момент вы сделали все, чтобы привязать все к одному и тому же маршруту (в данном случае косая черта верхнего уровня /).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...