动态路由取决于版本号

时间:2013-03-05 01:25:29

标签: node.js routing express

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

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

您必须使用app.param()。来自express API中的示例:

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

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

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

答案 2 :(得分:0)

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

像这样:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
    <title>Page Title</title>
    <css src="Namespace_Module::css/styles.css"/>
    <script src="Namespace_Module::js/angular/angular.min.js"></script>
    <script src="Namespace_Module::js/app.js"></script>
</head>
<body>
    <referenceContainer name="content">
        <block class="Namespace\Module\Block\Class" name="Namespace_Module" template="Template.phtml"></block>
    </referenceContainer>
</body>
</page>

api 是您的路由器对象