2016-07-15 2 views
1
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, построить новый объект, и назначить его в качестве reqmy_params, а затем передать это обработчику инвентаря. И это частично происходит, поскольку запрос выполняется разбор и затем назначается в моем промежуточном программном обеспечении. Почему req.params === {} в моей функции промежуточного программного обеспечения, но req.params = {itemID: 'abc'} в самом GET-обработчике?

Там нет других маршрутов с той же схемой, нет другого промежуточного слоя ...

Также не наблюдается никаких изменений при удалении параметров объекта от второй линии, т.е. var router = require('express').Router();

ответ

4

payloadMiddleware является общим промежуточное программное обеспечение, которое не объявлено для какого-либо конкретного шаблона URL, содержащего параметры (он соответствует любому запросу).

Экспресс также не знает, что запросы, переданные промежуточному программному обеспечению, в конечном итоге окажутся в обработчике для /inventory/:itemID/price.

Если вы хотите, чтобы промежуточное программное обеспечение для получения параметров, вы должны определенно использовать его против маршрутов, которые соответствуют шаблону:

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

Или как часть обработчика маршрута:

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

Я имел основанный на моем понимании точки монтирования по умолчанию из экспресс-документов: «Использует указанную функцию промежуточного программного обеспечения или функции с дополнительным путем пути монтирования, который по умолчанию соответствует«/». Таким образом, параметры будут заданы только в том случае, если промежуточное ПО специально используется 'use'd по заданному пути? Невозможно указать, что я хочу, чтобы это промежуточное программное обеспечение использовалось и у вас есть параметры пути для КАЖДОГО запроса? – Ben

+0

@Ben нет, это невозможно, в основном потому, что промежуточное ПО, когда оно используется автономно, не обращает внимания на любые другие средства промежуточного слоя или маршрута. Даже Express не будет знать заранее, если запрос будет соответствовать определенному параметризованному шаблону маршрута, поэтому он не сможет заранее создать 'req.params' (также по той простой причине, что у вас могут быть многочисленные параметризованные маршруты, поэтому, не зная, где запрос будет в конечном итоге, он не будет знать, какие параметры маршрута нужно проанализировать). – robertklep

Смежные вопросы