3

我正在使用 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) { /* ... */ });工作得很好。

我怎样才能做到这一点?

4

3 回答 3

2

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

这将使所有 HTTP 动词都可以访问,并且变量路由仍然有效。

我测试了它,它似乎工作。

根据评论编辑

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);
});
于 2013-03-05T02:04:03.710 回答
0

你必须使用app.param(). 从express API中的示例:

app.param('id', /^\d+$/);

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

您必须在 URL 中为您的参数提供正则表达式,因为主要,次要都是非负整数/^\d+$/,应该适合您。

于 2013-03-05T11:24:02.530 回答
0

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

像这样的东西:

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是你的路由器对象

于 2017-03-16T16:15:14.320 回答