为什么我的快速路由器中间件没有定义req.route?

时间:2019-05-21 17:22:44

标签: node.js express

我正在尝试使用路由器中间件来获取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());
}

我看到了使用Get route definition in middleware上的事件的解决方案,但想知道为什么需要这样做与我在这里所做的事情。我也不确定它的编写方式是否会使事情准确(例如更改新文物的交易名称)

2 个答案:

答案 0 :(得分:1)

是的。 req.route仅在您的最终 route中可用。从文档中:

  

包含当前匹配的路由,字符串

请注意粗体中的单词,您登录req.route的中间件不是route

所以可以这样说:

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

由于req对象在传递middleware时发生了突变,因此您可以访问req.route来匹配 last 匹配的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
})

答案 1 :(得分:0)

您可以像::

它在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() 
})