Node.js REST API 版本控制是否正确?

Raz*_*Raz 17 versioning api rest node.js

我想根据 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.
Run Code Online (Sandbox Code Playgroud)

棒极了。

在我们开始处理处理这个问题的实际方法之前,我们应该谈谈逻辑上的“默认最新版本控制”——我的意思是,如果用户不打算指定任何类型的版本,我应该为他提供最新版本还是抛出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"));
  }
});
Run Code Online (Sandbox Code Playgroud)

还有一些处理程序,如下所示:

// 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'));

}
Run Code Online (Sandbox Code Playgroud)

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

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

看一下项目结构:

在此处输入图片说明

你怎么看待这件事?

Rah*_*rma 16

您可以在应用程序级别添加它,而不是在每个路由中添加版本。所以它不会与 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);
Run Code Online (Sandbox Code Playgroud)


Pra*_*rma 5

我建议改用node-express-versioning模块。

它可以帮助您在不更改 API url 的情况下支持多个版本,只需发送 API 版本并将调用定向到该版本的路由控制器。

*

*//version taken out from header

    app.use(function(req, res, next)
    {
       req.version = req.headers['accept-version'];
       console.log(req.version);
       next();
    });

    //version path defined

    app.use('/api', versionRoutes({  
       "1.0.0": respondV1,
       "2.0.0": respondV2
    }));

    function respondV1(req, res, next)
     {   
        app.use('/api',routeV1);
        next();
     }
    function respondV2(req, res, next)
    {
       app.use('/api',routeV2);
       next();
    }*
Run Code Online (Sandbox Code Playgroud)

*