在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'),
}));
但它不起作用
这将不起作用,因为express并没有在每个处理程序上监视req.url
。它将在开始时被解析。实际上,修改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' ) );