使用 semver 的快速版本路由

Express version routing with semver

我正在使用 express-routes-versioning 来控制我的路线。

app.post('/messages', authUser, routesVersioning({
    "1.0.5": function(req, res) {
        moduleMessages.addV105(req, res);
    }
}, function(req, res) {
    moduleMessages.add(req, res);
}));

这工作正常,并为 1.0.5 版调用 addV105(),为所有其他版本调用 add()。但是我想为每个 >= 1.0.5(1.0.5、1.0.6、1.1.0、2.3...)的版本调用 addV105(),为 < 1.0 的每个版本调用 add()。 5 (1.0.4, 1.0.3, 1.0.0..)

实现这个的语法是什么?

express-routes-versioning 不支持很多 semver operations/ranges,仅支持 ^~,它们对您的用例没有用。

另一种 Express 中间件是 express-semver-routing, which is more flexible in terms of matching (it uses semver,因此您可以使用它的任何比较器)。

您确实需要稍微重写您的路线设置:

const version = require('express-semver-routing')();
...
app.post('/messages', authUser, version('>= 1.0.5'), function(req, res) {
  moduleMessages.addV105(req, res);
});

app.post('/messages', authUser, function(req, res) {
  moduleMessages.add(req, res);
});

(我想你可能要在第一个路由中切换version()authUser,否则authUser会在版本不匹配的情况下被调用两次)。

或者使用DRY原则,使用单独的router:

let router = express.Router();

router.use(authUser)
      .post('/', version('>= 1.0.5'), function(req, res) {
        moduleMessages.addV105(req, res);
      })
      .post('/', function(req, res) {
        moduleMessages.add(req, res);
      });

app.use('/messages', router);