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
даетПустой PARAMS объект в express.js промежуточного
A: {} # unclear why this is empty
B: { params: {},
query: { a: '1', b: '2' },
payload: {} }
C: {itemID: 'abc'}
Так что я запутался: Я ожидаю, что мой промежуточный слой, чтобы найти params
в req
, построить новый объект, и назначить его в качестве req
my_params
, а затем передать это обработчику инвентаря. И это частично происходит, поскольку запрос выполняется разбор и затем назначается в моем промежуточном программном обеспечении. Почему req.params === {}
в моей функции промежуточного программного обеспечения, но req.params = {itemID: 'abc'}
в самом GET-обработчике?
Там нет других маршрутов с той же схемой, нет другого промежуточного слоя ...
Также не наблюдается никаких изменений при удалении параметров объекта от второй линии, т.е. var router = require('express').Router();
Я имел основанный на моем понимании точки монтирования по умолчанию из экспресс-документов: «Использует указанную функцию промежуточного программного обеспечения или функции с дополнительным путем пути монтирования, который по умолчанию соответствует«/». Таким образом, параметры будут заданы только в том случае, если промежуточное ПО специально используется 'use'd по заданному пути? Невозможно указать, что я хочу, чтобы это промежуточное программное обеспечение использовалось и у вас есть параметры пути для КАЖДОГО запроса? – Ben
@Ben нет, это невозможно, в основном потому, что промежуточное ПО, когда оно используется автономно, не обращает внимания на любые другие средства промежуточного слоя или маршрута. Даже Express не будет знать заранее, если запрос будет соответствовать определенному параметризованному шаблону маршрута, поэтому он не сможет заранее создать 'req.params' (также по той простой причине, что у вас могут быть многочисленные параметризованные маршруты, поэтому, не зная, где запрос будет в конечном итоге, он не будет знать, какие параметры маршрута нужно проанализировать). – robertklep