我想设置一个 API 版本控制,类似于 Stripe 的做法,但我不太确定如何让 Express 满足我的需要。https://stripe.com/docs/api#versioning
我正在寻找的是,正确的路线是这样的:
/api/v1/调用
更重要的是,我希望他们传递像 stripe 允许的版本修订版本,所以如果他们发送像“API-Version:2015-08-15”这样的标头,它将映射到主要版本的特定版本。所以,v1 但版本更新于 2015-08-15。
本质上,如果 API 调用有不向后兼容的更新,我会为该特定调用推出新版本。Express 足够聪明,知道如果版本未通过,则使用最新版本。如果版本已通过,则每次调用都使用最新版本,直到版本日期为止。
我假设目录结构类似于:
也许在调用目录中,有一个索引可以检查标头版本并使用正确的文件。
所以也许例如
想法?有想法吗?
如果您在路由(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
我认为你可以在所有路由之前设置一个中间件来检查标头。
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)
| 归档时间: |
|
| 查看次数: |
10067 次 |
| 最近记录: |