node.js - NodeJS/Express API 版本控制

标签 node.js express

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

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

/api/v1/调用

关键是,我希望他们像 stripe 允许的那样传递一个版本修订,所以如果他们发送一个像“API-Version: 2015-08-15”这样的 header ,它将映射到该特定版本的主要版本。所以,v1不过是2015-08-15更新的版本。

本质上,如果对不向后兼容的 API 调用进行了更新,我会为该特定调用推出一个新版本。 Express 会足够聪明,知道如果版本未通过,请使用最新版本。如果版本通过,则在版本日期之前为每次调用使用最新版本。

我假设目录结构是这样的:

  • /路由器/
  • /路由器/v1
  • /router/v1/call
  • /router/v1/anotherCall

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

所以也许例如

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

想法?想法?

最佳答案

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

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

快速路由版本控制

模块允许单独对各个路由进行版本控制。它与特定的版本控制策略无关,并允许应用程序设置版本,因此您应该能够从 header 中解析版本并将其设置为中间件中的 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');
}

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

关于node.js - NodeJS/Express API 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32025904/

相关文章:

javascript - Node.js 将 : store req. ip 表达为变量

node.js - 在 Node Express 的 app.all() 函数中使用一组路由进行操作

javascript - 如何在 node.js (express) 中全局设置内容类型

javascript - 无法识别快速路线。响应 'Cannot GET'

node.js - 当 header 设置错误时从 body 解析 JSON

javascript - 如何找到一组持续时间中的常见重叠?

javascript - 为什么 array.forEach(() => { array.pop() }) 不会清空数组

node.js:如何使用 setInterval 和 clearInterval?

node.js - 随时随地访问请求上下文

node.js - 始终从 Bookshelf.js 中的相关模型中获取