NodeJS/Express API 版本控制

Bet*_*ta4 6 node.js express

我想设置一个 API 版本控制,类似于 Stripe 的做法,但我不太确定如何让 Express 满足我的需要。https://stripe.com/docs/api#versioning

我正在寻找的是,正确的路线是这样的:

/api/v1/调用

更重要的是,我希望他们传递像 stripe 允许的版本修订版本,所以如果他们发送像“API-Version:2015-08-15”这样的标头,它将映射到主要版本的特定版本。所以,v1 但版本更新于 2015-08-15。

本质上,如果 API 调用有不向后兼容的更新,我会为该特定调用推出新版本。Express 足够聪明,知道如果版本未通过,则使用最新版本。如果版本已通过,则每次调用都使用最新版本,直到版本日期为止。

我假设目录结构类似于:

  • /路由器/
  • /路由器/v1
  • /路由器/v1/呼叫
  • /router/v1/anotherCall

也许在调用目录中,有一个索引可以检查标头版本并使用正确的文件。

所以也许例如

  • /router/v1/call/index.js
  • /router/v1/call/20150810.js -- 第一个版本
  • /router/v1/call/20150815.js - 不向后兼容的更新版本。

想法?有想法吗?

pra*_*jam 5

如果您在路由(url)中管理版本并且客户端在标头中发送版本,那么express不提供任何优雅的方式来处理版本控制。此外,在路由中进行版本控制也并不轻松。

我写了一个简单的 npm 模块来解决这个问题。https://www.npmjs.com/package/express-routes-versioning

快速路线版本控制

模块允许单独对各个路由进行版本控制。它与特定的版本控制策略无关,并允许应用程序设置版本,因此您应该能够从标头中解析版本并将其设置为中间件中的 req.version 。它支持 semver 版本控制格式和符号,以将多个版本映射到单个函数。有关其工作原理的示例代码。

var app = require('express')();
var versionRoutes = require('express-routes-versioning')();
app.listen(3000);
app.use(function(req, res, next) {
    //req.version is used to determine the version
   req.version = req.headers['accept-version'];
   next();
});
app.get('/users', versionRoutes({
   "1.0.0": respondV1, 
   "~2.2.1": respondV2
}));

// curl -s -H 'accept-version: 1.0.0' localhost:3000/users
// version 1.0.0 or 1.0 or 1 !
function respondV1(req, res, next) {
   res.status(200).send('ok v1');
}

//curl -s -H 'accept-version: 2.2.0' localhost:3000/users
//Anything from 2.2.0 to 2.2.9
function respondV2(req, res, next) {
   res.status(200).send('ok v2');
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,如果客户端版本与服务器中提供的版本不匹配,模块将提供该路由中可用的最新版本回调。可以通过提供额外的回调来覆盖此行为。更多信息和源代码请访问https://github.com/Prasanna-sr/express-routes-versioning


csh*_*ion 0

我认为你可以在所有路由之前设置一个中间件来检查标头。

app.use("*",function (req,res,next) {
  var headers = req.headers
  //Process 
  req.apiVersion = "version"
  next()
}
//all your routes
Run Code Online (Sandbox Code Playgroud)

这是一个示例,但您可以在路由器实例中操作标头,然后将 req 传递给其他路由

//v1/call/index.js
//all your routes
app.use("/v1/call",function (req,res){
   var version = req.apiVersion;
   //execute something depending on version

})
Run Code Online (Sandbox Code Playgroud)