为现有的 NodeJS 服务器生成 Swagger 文档

Posted

技术标签:

【中文标题】为现有的 NodeJS 服务器生成 Swagger 文档【英文标题】:Generate Swagger Document for existing NodeJS server 【发布时间】:2016-02-05 16:38:17 【问题描述】:

根据Swagger website,有两种方法:自下而上和自上而下。

我有一个想要在 Azure 环境中部署的现有 NodeJS 服务器,它需要一个招摇文档(API APP)。

有人知道使用代码生成招摇的工具吗?如果你能指出一个教程就更好了。没找到。

【问题讨论】:

你的 Nodejs 服务器建立在哪个框架上?如果是快递,可以参考github.com/shawngong/Swagger-Node-Express-For-Existing-APIs。要将 Nodejs 应用部署到 Azure Web Apps,请参考azure.microsoft.com/en-us/documentation/articles/… @GaryLiu-MSFT 是的,我使用了快递。我尝试了您发送的这个项目,但我无法真正理解它。在教程中它告诉你准备好所有东西,顺便说一下,很多代码,然后它没有说要做什么来生成swagger doc.... 我认为您可以先按照分步教程先构建 swagger doc,或者您能告诉我是哪一步阻碍了您吗? 也许你需要这样的东西? mherman.org/blog/2016/05/26/swagger-and-nodejs/#.WZ7LQCgjHIU据此,您可以使用模块'swagger-jsdoc'从您的项目中生成swagger doc。 【参考方案1】:

大多数替代方案需要通过 Json、Yaml 甚至嵌入 JSdocs 的某种 API 规范。另一方面,有一些运行时分析器会拦截 HTTP 请求并按需构建该规范。

express-sitemap-html 采用不同的方法在设置时检查 express 对象及其路由。因此,它始终为现有 express 实例上已安装的路由提供最新的 swagger UI。

const sitemap = require('express-sitemap-html')
...
sitemap.swagger('Title', app) // app is an express instance

然后从您的域/api-docs 获取 Swagger UI。

【讨论】:

【参考方案2】:

很多开发人员仍然遇到这个问题,所以我构建了一个开源工具来提供帮助——该工具有点像用于 API 的 Git。它的工作原理是在您开发 API、分析流量并随着 API 行为的变化为您更新规范时运行代理。希望该工作流程可以为您节省大量时间:https://github.com/opticdev/optic

【讨论】:

【参考方案3】:

问题有点老了,但仍然存在。只需像这样嵌入分析中间件,就可以完全自动生成 Swagger (OpenAPI) 规范:https://github.com/mpashkovskiy/express-oas-generator

const express = require('express');    
const expressOasGenerator = require('express-oas-generator');
let app = express();
expressOasGenerator.init(app, );

对您的服务运行一些客户端或 REST API 测试并打开 http://host:port/api-docs

【讨论】:

您好,感谢您提供的信息,我也在使用 express-oas-generator 使 api 文档正常工作,但作为响应,它有时不会在 ui 中更新,它有时会更新,您不能帮助修复问题 当然,我可以请您创建一个问题并在此处详细描述该问题:github.com/mpashkovskiy/express-oas-generator/issues 吗?【参考方案4】:

据我所知,您的选择是:

    使用swagger-node-express 在我看来非常麻烦。 在swagger editor 的帮助下自己手动编写swagger 文档,正如SO Answer 中所建议的那样

如果您选择选项 2,则可以使用 swagger-ui-express 生成 swagger-ui

【讨论】:

【参考方案5】:

在this tutorial 之后,将 Swagger 集成到现有的 express 应用程序中并不难。

一般情况下,我们可以按照以下步骤进行:

    在我们的package.json 中添加依赖项,然后运行npm install 来安装它们。依赖项应该是:

    "dependencies": 
            "swagger-node-express": "~2.0",
            "minimist": "*",
            "body-parser": "1.9.x",
            ...
    
    

    下载Swagger-UI的zip项目,将dist文件夹复制到我们项目的根目录下,目录应该是这样的:

    app.js开头引入依赖:

    var argv = require('minimist')(process.argv.slice(2));
    var swagger = require("swagger-node-express");
    var bodyParser = require( 'body-parser' );
    

    为swagger doc设置子路径:

    var subpath = express();
    app.use(bodyParser());
    app.use("/v1", subpath);
    swagger.setAppHandler(subpath);
    

    确保/dist 能够以快递方式提供静态文件: app.use(express.static('dist'));

    设置 API 信息:

    swagger.setApiInfo(
        title: "example API",
        description: "API to do something, manage something...",
        termsOfServiceUrl: "",
        contact: "yourname@something.com",
        license: "",
        licenseUrl: ""
    );
    

    为 Swagger UI 引入/dist/index.html

    subpath.get('/', function (req, res) 
        res.sendfile(__dirname + '/dist/index.html');
    );
    

    完成swagger配置:

    swagger.configureSwaggerPaths('', 'api-docs', '');
    
    var domain = 'localhost';
    if(argv.domain !== undefined)
        domain = argv.domain;
    else
        console.log('No --domain=xxx specified, taking default hostname "localhost".');
    var applicationUrl = 'http://' + domain;
    swagger.configure(applicationUrl, '1.0.0');
    

    /dist/index.html中配置doc文件依赖:

    if (url && url.length > 1) 
        url = decodeURIComponent(url[1]);
     else 
        <del>url = "http://petstore.swagger.io/v2/swagger.json";</del>
        url = "/api-docs.json";
    
    

    使用您的 API 信息创建 api-docs.json 文件,将其放在 dist 文件夹中。

在本地运行Express应用,访问http://localhost:3000/v1,我们可以查看swagger doc。

这是我的test sample repo 供您参考。

【讨论】:

这不会“生成”任何东西。它只是在应用程序旁边提供 swaggerUI? 我从我的 express 3 应用程序中生成了简单的 swagger.json,以通过 npmjs.com/package/express-swagger-export 包导入 Postman 应用程序。我为自己构建了它,但也许它对某人有用。 swagger project editor 之后,Swagger 编辑器会使用这个吗? 投反对票,因为它不生成,它是手工工作,而不是“不难”。

以上是关于为现有的 NodeJS 服务器生成 Swagger 文档的主要内容,如果未能解决你的问题,请参考以下文章

Swagger 可以根据现有的快速路由自动生成其 yaml 吗?

Swagger 生成 Node.JS Express 服务器代码

swagger文档转换为WebApiClient声明式代码

为现有的 django 模式重新创建数据库

findViewById 为现有的包含布局返回 null

为现有的 Jersey 项目从 Netbeans JPA 添加休眠