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'}
所以我很困惑:我希望我的中间件在params
中找到req
,构建新对象,并将其作为req
分配给my_params
,然后通过到库存处理程序。这部分发生了,因为查询字符串正在被解析,然后在我的中间件中分配。为什么我的中间件函数中有req.params === {}
,而GET处理程序本身中有req.params = {itemID: 'abc'}
?
没有其他路由具有相同的模式,没有其他中间件......
当我从第二行删除选项对象时,也没有观察到任何变化,即var router = require('express').Router();
答案 0 :(得分:4)
payloadMiddleware
是一个通用中间件,未针对包含参数的任何特定URL模式声明(它匹配任何请求)。
Express也不知道传递给中间件的请求最终会在/inventory/:itemID/price
的处理程序中结束。
如果您希望中间件接收参数,则必须专门针对与模式匹配的路由使用它:
app.use('/inventory/:itemID/price', payloadMiddleware);
或作为路线处理程序的一部分:
router.get('/inventory/:itemID/price', payloadMiddleware, async function ...);