Expressjs:修改版本控制的路由路径



在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.urlreq对象内部的任何内容都不是您想要做的事情

你可以做的是:

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' ) );

最新更新