首页 > 解决方案 > Node.js REST API 版本控制是否正确?

问题描述

我想根据 URL 版本指定来管理我的 REST API。

例如:

api.mydomain.com/v1/rides/
// will return all rides based on v1.

api.mydomain.com/v2/rides/
// will return all rides based on v2 (probably with some braking changes).

api.mydomain.com/rides/
// will return all rides based on v2, since v2 is the newest.

棒极了。

在我们开始处理处理这个问题的实际方法之前,我们应该谈谈逻辑上的“默认最新版本”——我的意思是,如果用户不指定任何类型的版本,我应该为他提供最新版本还是抛出404 未找到错误?

我应该强制用户指定 API 版本吗?

如果我这样做,是否有任何“解析”特定/最新版本的标准?

我告诉你为什么我对此感到担忧:假设“Dan”安装了应用程序,该应用程序在最新的 API 端点(例如 V1)上进行中继,然后我发布了具有制动变化的 V2。由于 Dans 默认“监听”最新版本,因此 Dans 应用程序将崩溃。

这根本不是一个好的行为。也许我应该阻止使用“默认的最新版本”?也许我应该使用 Dans 应用程序来监听特定版本,而远程开发人员将我的 API 作为 Web 服务访问可以在默认情况下有权在特定版本或最新版本之间进行选择?

有什么标准吗?

**

现在让我们实际谈谈。假设我有一个处理这些请求的路由器,可能是这样的:

// app.js file

app.use((req, res, next) => {
  try {
    require('../resources/' + req.url.split('/')[1] + '/' + req.url.split('/')[1] + '-router')(app);
    next();
  } catch(err) {
    dep.cast(res, 404, new Error("Not Found"));
  }
});

还有一些处理程序,像这样:

// resources/rides/rides-router.js file

module.exports = function(app) {

  // GET ride - select a ride
  app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1/get-ride'));
  app.get("/v2/rides/:id", dep.verifyToken(), require('./api/v2/get-ride'));

  // POST ride - insert a new ride
  app.post("/v1/rides", dep.verifyToken(), require('./api/v1/set-ride'));

}

如您所见,我有处理程序将请求发送到 API 中的特定部门,按 V1、V2 等分割。

这让我想知道它是否有权在不同的文件夹中一遍又一遍地拥有包含相同功能的相同页面,一个用于 V1,一个用于 V2。当然,有一些制动变化,但它们可能会相似。它不是与重复代码接壤吗?

看项目结构:

在此处输入图像描述

你怎么看待这件事?

标签: node.jsrestapiversioning

解决方案


您可以在应用程序级别添加它,而不是在每条路线中添加版本。所以它不会与 API 路由紧密耦合。

import * as express from 'express';

// v1/get-ride.js
const router = express.Router();
router.post('/rides/:id', dep.verifyToken(), (req, res) => {
    // Your code
});
app.use('/v1', router);


// v2/get-ride.js
const router = express.Router();
router.post('/rides/:id', dep.verifyToken(), (req, res) => {
    // Your code
});
app.use('/v2', router);

推荐阅读