我对Node.js很新,我面临以下问题。
我的中间件以链接api/v1/login
和一堆端点开始。
然后api/v1.1
引入了另外两个端点。 api/v1.2
现在是最后一个,并获得了一些新的终点。
如何以有效的方式处理这个api版本?如何从可用于下一版本的版本中创建端点?
答案 0 :(得分:44)
首先,如果您正在构建REST API并且刚刚开始,则可能需要考虑使用Restify而不是Express。虽然Express当然可以用于此目的,但Restify的设计符合REST API服务器的所有要求:标准化异常,API版本等。
如此说,我相信你的第一个问题是设计缺陷。只有当新API 不向后兼容先前版本时,即主要版本增加时(例如从v1到v2),才应创建单独的端点。这应该尽可能少发生!
如果您只是添加新功能或进行其他不会破坏现有代码的调整,则不应创建不同的端点。因此,您不应该为v1.1,v1.2等创建端点,前提是所有与v1.0一起使用的代码也适用于v1.1(如果不是这样,那么你&# 39;重新引入不向后兼容的更改,因此您应该考虑将版本更改为v2)
请注意,每次引入向后不兼容的更改时,所有用户都需要更新其代码,并且您必须支持旧API一段时间,以便让所有用户都能更新。对于您(您需要维护旧的代码库)和您的用户(他们需要更新他们的代码),这是一个昂贵的过程,因此应该尽可能不频繁地发生。此外,对于每个版本,您需要编写文档,创建示例等。
(底线:花费很多设计API服务器的时间,因此它可能会持续而不会出现向后不兼容的更改(尽可能长)
要回答您的问题,那么,一种方法可以是为每个API集(每个版本)创建子文件夹,然后相应地设置路由器。例如,您的项目将如下所示:
/
-- app.js
-- routes/
-- -- v1/
-- -- -- auth.js
-- -- -- list.js
-- -- v2/
-- -- -- auth.js
-- -- -- list.js
这不应该是一个问题:由于v2与v1不向后兼容,很可能两个文件有很大不同。
然后,在Express上只需相应地使用路由器。例如:
app.get('/v1/list/:id', v1.list)
app.all('/v1/auth', v1.auth)
app.get('/v2/list/:id', v2.list)
app.all('/v2/auth', v2.auth)
但是还有其他选择。例如,更优雅(虽然稍微高级)的解决方案可以是:http://j-query.blogspot.ca/2013/01/versioned-apis-with-express.html
然而,如果您计划在v1和v2之间实现许多重大差异(重用代码的可能性很小),那么每个后向不兼容的更改应该会看到API的主要版本有所增加。那么这种方法不适合你。
在最后一种情况下,您可能希望为v1和v2创建两个单独的Node.js应用程序,然后使用nginx配置正确的路由。版本控制不会在应用级别完成(每个应用都会回复' / auth',' / list /:id'以及NOT' / v1 / auth' ,' / v1 / list:id'等),但nginx会使用前缀' / v1 /'转发请求。一个工作服务器,以及前缀为' / v2 /'到另一个。
答案 1 :(得分:10)
像restify这样的框架更适合api版本化,但是如果你使用express并且需要一个轻量级模块来版本化你的路由,那么试试这个npm模块https://www.npmjs.com/package/express-routes-versioning
模块允许单独对各个路径进行版本控制。它支持服务器上的基本semver版本控制以匹配多个版本。 (如果需要的话)。它与特定版本控制策略无关,并允许应用程序设置版本。
示例代码
multipart-form/data
答案 2 :(得分:-3)
我猜你的API违反了REST约束,至少是无状态约束。检查REST的统一接口约束。它告诉您如何将客户端与API的实现分离。在你这样做之后,你可能不再需要版本控制了。
如果您不想应用REST约束,那么我认为URL应该只包含主要版本号(表示非向后兼容的更改)。之后,您可以定义供应商特定的MIME类型或内容类型参数,您可以在其中描述次要,审阅和构建版本号(如果需要)。因此,您的客户应该使用这些版本参数发送accept和content-type标头。
请注意,如果您想一次支持多个版本,则必须为每个版本编写文档。