express.js 中间件中的空参数对象

Ben*_*Ben 3 javascript node.js express ecmascript-6

const app = express();
var router = require('express').Router({mergeParams: true});
const payloadMiddleware = (req, resp, next) => {
  console.log('A:',req.params);
  const {params, query} = req;
  const payload = req.body;
  req.my_params = { params, query, payload };
  next();
};

router.use(payloadMiddleware);

router.get('/inventory/:itemID/price', async function GetPrice(req, res, next) {
  console.log('B', req.my_params);
  console.log('C', req.params);
}

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use('/', router);
server = app.listen(port);
Run Code Online (Sandbox Code Playgroud)

GET /inventory/abc/price?a=1&b=2 产量

A: {} # unclear why this is empty
B: { params: {},
     query: { a: '1', b: '2' },
     payload: {} } 
C: {itemID: 'abc'} 
Run Code Online (Sandbox Code Playgroud)

所以我很困惑:我希望我的中间件找到paramsin req,构造新对象,并将其分配给reqas my_params,然后将其传递给库存处理程序。这部分发生了,因为查询字符串正在被解析,然后在我的中间件中分配。为什么req.params === {}在我的中间件函数中,而req.params = {itemID: 'abc'}在 GET 处理程序本身中?

没有其他具有相同模式的路由,没有其他中间件......

当我从第二行中删除选项对象时,也没有观察到任何变化,即 var router = require('express').Router();

rob*_*lep 8

payloadMiddleware是一个通用中间件,它没有为任何包含参数的特定 URL 模式声明(它匹配任何请求)。

Express 也不知道传递给中间件的请求最终会在/inventory/:itemID/price.

如果您希望中间件接收参数,则必须专门针对匹配模式的路由使用它:

app.use('/inventory/:itemID/price', payloadMiddleware);
Run Code Online (Sandbox Code Playgroud)

或者作为路由处理程序的一部分:

router.get('/inventory/:itemID/price', payloadMiddleware, async function ...);
Run Code Online (Sandbox Code Playgroud)