Почему в промежуточном программном обеспечении моего экспресс-маршрутизатора не определено req.route? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь использовать промежуточное ПО маршрутизатора, чтобы получить значение req.route .У меня есть простой код, подобный этому:

server.js

import api from './api';
// ...
app.use('/api/', api);

api / index.js

Object.keys(routes).forEach(key => {
  router.use(function(req, res, next) {
    console.log('++++++++++++++++++');
    console.log(req.route);
    console.log('++++++++++++++++++');

    next();
  });
  // so localhost:8080/api/currentkey works
  router.use(`/${key}`, routes[key]);
});

Когда я нажимаю /api/currentkey, req.route не определено.Если я перемещу промежуточное программное обеспечение после определения маршрута (вместо ранее), оно, похоже, не сработает вообще.

Все мои объекты маршрутизатора настроены с использованием метода, подобного следующему:

import express from 'express';
import asyncify from 'express-asyncify';

export default function() {
  return asyncify(express.Router());
}

Я видел решение с использованием событий на Получить определение маршрута в промежуточном программном обеспечении , но мне интересно, почему это требуется по сравнению с тем, что я здесь сделал.Я также не уверен, что то, как оно написано, сделает вещи точными (например, изменение имени транзакции для новой реликвии)

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Это верно.req.route доступно только в вашем финале route.Из документов:

Содержит текущий маршрут, строку

Обратите внимание на слова полужирный , Вашпромежуточное программное обеспечение, в которое вы входите req.route не является route.

Так что можно сказать:

app.get('/path', (req, res) => {
  console.log(req.route);
})

Поскольку объект req мутирует при прохождении вокругmiddleware, вы можете получить доступ к req.route для последнего соответствия route.Например:

app.get('/path', (req, res, next) => {
  res.send('hello');
  next() // <-- calling next middleware
})

// middleware mounted after the above route
app.use((req, res, next) => {
  console.log(req.route) // outputs the last matched at /path route
})
0 голосов
/ 21 мая 2019

Вы можете сделать это, как ::

Он отлично работает в koa, но не уверен в экспрессе: *

app.use(async (req, res, next)=> {
  // Do your work
  await next(); // This will work fine, wait for next route/middleware
});

app.get('/path', (req, res, next) => {
  res.send('hello');
  next() 
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...