我继承了一个现有的API,并希望使用Swagger对其进行文档化,但我还不完全了解其全部范围。 Swagger(或其他中间件/工具)是否可以根据现有的express路由自动生成yaml(用于swagger)?
从其他问题中看到的情况,似乎这主要是手动工作,但我正在仔细检查是否有人找到了解决方法。
我继承了一个现有的API,并希望使用Swagger对其进行文档化,但我还不完全了解其全部范围。 Swagger(或其他中间件/工具)是否可以根据现有的express路由自动生成yaml(用于swagger)?
从其他问题中看到的情况,似乎这主要是手动工作,但我正在仔细检查是否有人找到了解决方法。
我既有自动生成Swagger json的经验,也有手动编写API Swagger文档的经验。基于我的经验,以下是两种方法的利弊。
我们使用swagger-node-express模块结合swagger-ui使用。
https://www.npmjs.com/package/swagger-node-express
https://github.com/swagger-api/swagger-ui
优点:
非常容易文档化,只需要在资源定义之前加入几行代码即可,模块会自动生成文档(json)。
缺点:
使用此包时,您不再使用纯Express。您的路由定义必须通过Swagger模块定义,这使您远离了原生Express。
我们将swagger-ui引入项目中,并手动编写文档。
https://github.com/swagger-api/swagger-ui
优点:
该方法将文档与Express框架分离。Express端点按照正常方式编写,Swagger文档则与Express框架分开定义。允许您编写纯粹的Express。
缺点:
由于您需要手动编写和更改yaml或json文件,因此文档更改会变得有点繁琐。这比仅更新资源前的几行代码要困难一些。这种方法也更容易出现文档错别字和错误,因为它完全是手工输入的。
如果您打算手动编写Swagger文档,请使用下面的Swagger编辑器验证您的手动文档。
http://editor.swagger.io/#/
对于这个API项目,我们开始使用swagger-node-express包自动生成文档。但是,我们意识到将Swagger文档与express库解耦是很重要的,以便我们可以使用Express的所有功能和功能。我建议手动编写文档,以便完全控制Swagger文档和应用程序将使用的Express Web框架。
有一个选项:您可以嵌入中间件,分析所有请求和响应,并为您生成规范:https://github.com/mpashkovskiy/express-oas-generator
然后,您可以通过您的应用程序Swagger UI使用它,例如:http://host:port/api-docs
expressOasGenerator.init(app, {});
如果你想了解实现细节,那么这里是主要的初始化程序:https://github.com/mpashkovskiy/express-oas-generator/blob/master/index.js#L291 - mpashkovskiyconst sitemap = require('express-sitemap-html')
...
sitemap.swagger('Your app name', app) // given that app is an express instance
不必在运行时分析HTTP请求,此方法检查express app
实例和已挂载的路由。
优点:您无需执行先前的请求即可获取可用路由的更新列表。
缺点:它提供了未经过类型定义的参数功能。
是的!!! 你可以使用这个很棒的项目 typescript-test。这里有一个示例应用程序。克隆它,运行npm i
,npm run swagger
并转到/dist/swagger.json。完成了。Swagger yaml和json是基于express路由生成的!
app.get("/banana/:count",
// use JSDoc for JS
(req: express.Request<{ count: string }, string>, res) => {
res.send([...Array(Number(req.params.count))].map(_ => "").join(''));
});
与上述示例(经过我尝试的那些)不同的是,
(我意识到这是一个古老的帖子,但我多次访问此问题以寻找答案,所以我想分享我的解决方案。)