在ExpressJS应用程序中,考虑给定的路径
GET /v1/users/detail
GET /v2/users/detail
路由器是
// v1/users.js
router.get('/v1/users/detail', (req, res, next) => res.send('v1'));
// v2/users.js
router.get('/v2/users/detail', (req, res, next) => res.send('v2'));
由于我计划使用基于标头的版本控制,所以我打算这样做,
// users.js
router.get('/users/detail', routesVersioning({
'1.0.0': (req, res, next) => res.send('v1'),
'2.0.0': (req, res, next) => res.send('v2'),
}));
基本上,我的客户端将使用相同的URL(路径中的版本),但是我的中间件应使用版本标头重写该URL。
我尝试过的事情:
app.use('/v(1|2)/users/*', (req, res, next) => {
const [_, version] = req.originalUrl.split('/');
if (version === 'v1') {
req.version = '1.0.0';
} else {
req.version = '2.0.0';
}
// req.originalUrl = req.originalUrl.replace(/\/v(1|2)/i, '');
req.url = req.originalUrl.replace(/\/v(1|2)/i, '');
next('route'); // tried next(); too
});
app.get('/users/detail', routesVersioning({
'1.0.0': (req, res, next) => res.send('v1'),
'2.0.0': (req, res, next) => res.send('v2'),
}));
但这没用
答案 0 :(得分:0)
由于req.url
为not being watched by express on every handler,因此无法使用。它将在开始时进行解析。实际上,修改req.url
或req
对象内部的任何内容都不是您想要做的事情。
您可以做的是:
app.use( '/v2', v2Router );
app.use( '/v1', v1Router );
const v1Router = express.Router(),
v2Router = express.Router();
v1Router.get( '/users/details', ( req, res ) => res.send( 'v1' ) );
v2Router.get( '/users/details', ( req, res ) => res.send( 'v2' ) );