dynamic路由取决于版本号

我正在使用Express3框架在node.js的web api上工作,我希望我的路由看起来像/v0.1/function

理想情况下,路由应该通过查看URL中给出的主版本号和次版本号自动加载指定的版本模块。 我到目前为止的做法是:

 app.use('/v:major.:minor', function(req) { return require('./v' + req.params.major + '.' + req.params.minor); }); 

在我的./v0.1/index.js

 module.exports = function() { var express = require('express'), app = express(); app.get('/test', function(req, res) { res.json({ success: true }); }); return app; }(); 

如果我现在调用/v0.1/test ,它与路由(404)不匹配,但app.get('/v:major.:minor', function(req, res) { /* ... */ }); 工作得很好。

我怎样才能做到这一点?

我想你想app.allhttp://expressjs.com/api.html#app.all

这将使得所有的HTTP动词都可以访问,并且仍然具有可变路由的工作。

我testing了它,它似乎工作。

按照评论编辑

 app.all('/v:major.:minor/:endpoint', function(req, res, next) { var version_handler = require('./v' + req.params.major + '.' + req.params.minor); if (!req.params.endpoint in version_handler) // endpoint_isn't supported at this version, 404 version_handler[req.params.endpoint](req, res, next); }); 

你必须使用app.param() 。 从快速API的例子:

 app.param('id', /^\d+$/); app.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); }); 

你必须在URL中为你的参数提供正则expression式,因为major,minor都是非负整数/^\d+$/应该是你的。

我发现的最简单的方法是链接一个自定义的中间件:

像这样的东西:

 app.use('/api/:version', function (req, res, next) { console.log('The version name is : ', req.params.version) req.version=req.params.version; //use this inside api router next() // pass control to the next handler },api); 

api是你的路由器对象