gpt4 book ai didi

Node.js REST API 版本控制的正确方式?

转载 作者:搜寻专家 更新时间:2023-10-31 23:44:44 26 4
gpt4 key购买 nike

我想根据 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。当然,有一些制动变化,但它们可能会相似。这不是和重复代码接壤吗?

查看项目结构:

enter image description here

你怎么看这件事?

最佳答案

您可以在应用级别添加它,而不是在每个路由中添加版本。因此它不会与 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);

关于Node.js REST API 版本控制的正确方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com