在进行 Web 应用程序的开发时,经常需要对 API 进行版本控制,以便于进行升级、优化、更改等操作,同时还能保证向后兼容性。在 Express.js 中,我们可以利用中间件的方式进行 API 版本的控制。
实现方法
1. 创建路由文件夹
首先,在项目的根目录下创建一个名为 routes
的文件夹,该文件夹用于存放不同的 API 版本路由。
2. 创建路由文件
在 routes
目录下分别创建 v1.js
和 v2.js
两个文件,用于存放 API v1 和 API v2 的路由。
-- -------------------- ---- ------- -- ------------ ----- ------- - ------------------- ----- ------ - ----------------- ------------------- ----- ---- -- - ---------- ----- ------- ---- -- --- --- -------------- - -------
-- -------------------- ---- ------- -- ------------ ----- ------- - ------------------- ----- ------ - ----------------- ------------------- ----- ---- -- - ---------- ----- ------- ---- --- ------- ------ --- --- -------------- - -------
以上代码分别定义了两个版本的 /user
路由,其中 API v1 只返回 name
和 age
信息,而 API v2 还多了 gender
信息。
3. 创建中间件
在项目根目录下创建名为 versionControl.js
的中间件文件,用于对 API 版本进行控制。
-- -------------------- ---- ------- -- ----------------- ----- -- - ----------------------- ----- -- - ----------------------- -------------- - --------- -- - ----- --- - ----------------- -------------- ---- -- -- --- -- -- -------------- ---- -- -- --- -- -- -- -------- --- ----- - ------ --- - ---- -- -------- --- ----- - ------ --- - ------ ---- --
以上代码中,通过 require
引入 v1.js
和 v2.js
,然后定义了一个中间件函数,将不同版本的路由挂载到 /v1
和 /v2
上,根据客户端传入的版本号,返回相应的路由。
4. 使用中间件
在 app.js
中引入中间件并使用。
-- -------------------- ---- ------- -- ------ ----- ------- - ------------------- ----- -------------- - ---------------------------- ----- --- - ---------- -- ----- ------------------------------ -- -- --- -- -- ------------------------------ -- -- --- -- ---------------- -- -- ------------------- ------- -- -------------------------
在 app.js
中使用中间件,传递当前需要使用的 API 版本号,这里以 API v1 为例。
5. 测试 API
启动服务后,在浏览器中输入 http://localhost:3000/v1/user
,应该能够看到返回的数据为:
{ "name": "Alex", "age": 24 }
这里使用了 API v1 的路由。
6. 升级 API
如果要升级 API 版本,只需要在 v2.js
中增加/修改相应的路由,然后在中间件中增加相应的逻辑,无需修改原有 API 版本的路由。
总结
在 Express.js 中,使用中间件可以很方便地实现 API 版本控制的目的,使我们的 Web 应用程序更加稳定和具有扩展性。同时,这种设计也符合 RESTful API 的设计规范,是一种良好的实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a5f2daadd4f0e0ffe89c56