express.js中间件中的空params对象

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); 

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'} 

所以我很困惑:我希望我的中间件在reqfindparams ,构build新的对象,并将其作为my_params分配给req ,然后将其传递给库存处理程序。 这是部分发生的,查询string正在parsing,然后分配在我的中间件。 为什么在我的中间件函数中req.params === {} ,但是GET处理程序本身中的req.params = {itemID: 'abc'}

没有其他路线具有相同的模式,没有其他中间件…

当我从第二行删除选项对象时,也没有发现变化,即var router = require('express').Router();

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

Express也不知道传递给中间件的请求最终会在/inventory/:itemID/price处理程序中结束。

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

 app.use('/inventory/:itemID/price', payloadMiddleware); 

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

 router.get('/inventory/:itemID/price', payloadMiddleware, async function ...);