首先,如果您正在构建 REST API 并且刚刚开始,您可能需要考虑使用 Restify 而不是 Express。虽然 Express 当然可以用于此目的,但 Restify 的设计符合 REST API 服务器的所有要求:标准化异常、API 版本控制等。
因此,我相信您的第一个问题是设计缺陷。仅当新 API 不与先前版本向后兼容时,即当主要版本增加时(例如从 v1 到 v2),您才应该创建单独的端点。这应该尽可能少发生!
如果您只是添加新功能或进行其他不破坏现有代码的调整,那么您不应该创建不同的端点。因此,您不应该为 v1.1、v1.2 等创建端点,前提是所有适用于 v1.0 的代码也适用于 v1.1(如果不是这种情况,那么您将引入更改不向后兼容,因此您应该考虑将版本更改为 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
注意这个方法
虽然根据 semver,如果您计划在 v1 和 v2 之间实现许多实质性差异(几乎不可能重用代码),那么每个向后不兼容的更改都应该会增加 API 的主要版本,那么这种方法不适合你。
在最后一种情况下,您可能希望为 v1 和 v2 创建两个单独的 Node.js 应用程序,然后使用 nginx 配置正确的路由。版本控制不会在应用程序级别完成(每个应用程序将响应 '/auth'、'/list/:id' 而不是 '/v1/auth'、'/v1/list:id' 等),但 nginx会将前缀为“/v1/”的请求转发到一个工作服务器,将前缀为“/v2/”的请求转发到另一台。