У меня есть кодовый блок express следующим образом:
var express = require('express');
var bodyParser = require('body-parser');
// server application
var app = new express();
app.use('/:user', bodyParser.json());
// application level validations
app.use('/:user', (req, res, next) => {
console.log('[application]', req.params);
req.params.user = parseInt(req.params.user);
next();
});
// level-1 router
var router1 = express.Router({
mergeParams: true
});
// level-1 router registered with application
app.use('/:user/one/:a', router1);
// router level-1 validations
router1.use('/', (req, res, next) => {
console.log('[router-1]', req.params);
req.params.a = parseInt(req.params.a);
next();
});
// level-2 router
var router2 = express.Router({
mergeParams: true
});
// level-2 router registered with level-1 router
router1.use('/two/:b', router2);
// router level-2 validations
router2.use('/', (req, res, next) => {
console.log('[router-2]', req.params);
req.params.b = parseInt(req.params.b);
next();
});
// level-2 router has a resource
router2.get('/func', (req, res, next) => {
res.send('Done!');
});
// start the application
app.listen(2345);
Здесь можно предположить, что каждое промежуточное ПО выполняет некоторые проверки параметров пути и обновляет свойства на месте. Скажем, это промежуточное программное обеспечение проверяет тип значения и обновляет значение как соответствующий тип, вместо того, чтобы сохранять как строку (как AJV делает, когда { coerceTypes: true }
).
В приведенном выше блоке кода я ожидаю, что обновленные значения в req.params
через посредников, но не происходит. То есть для такого звонка http://localhost:2345/123/one/1/two/2/func
в консоли я ожидаю ...
[application] {
user: '123'
}
[router-1] {
user: 123, a: '1'
}
[router-2] {
user: 123, a: 1, b: '2'
}
Но я получаю ...
[application] {
user: '123'
}
[router-1] {
user: '123', a: '1'
}
[router-2] {
user: '123', a: '1', b: '2'
}
Мне нужна помощь для достижения ожидаемого выход.