Expressjs:修改路由路径以进行版本控制

时间:2018-12-11 10:03:39

标签: javascript node.js express

在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'),
    }));

但这没用

1 个答案:

答案 0 :(得分:0)

由于req.urlnot being watched by express on every handler,因此无法使用。它将在开始时进行解析。实际上,修改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' ) );