首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地在swagger文件中使用$ref,同时使用swagger-ui-express和swagger-jsdoc

如何正确地在swagger文件中使用$ref,同时使用swagger-ui-express和swagger-jsdoc
EN

Stack Overflow用户
提问于 2018-12-29 10:37:51
回答 2查看 12.7K关注 0票数 15

我开始在swagger-ui-express swagger -jsdoc中使用swagger来自动记录我现有的API,它是用nodejs和express编写的(如这里描述的- 示例)。

当我试图在注释中将$ref添加到现有的JSON文件(与所有js文件位于我的项目所在的目录中)时,我遇到了一个问题。

我的目录如下所示

我试着编写本地路径(./schema.json)和绝对路径,尝试使用#,使用了许多语法,但什么也没有成功。

我的注释如下所示:

代码语言:javascript
运行
复制
/**
 * @swagger
 * /testing:
 *    get:
 *      description: This should show the json schema
 *      responses:
 *          200:
 *              description: "successful operation"
 *              schema:
 *                 $ref: "./schema.json"
 */

我希望swagger用户界面在我的请求部分向我展示JSON模式。我得到了以下错误-

代码语言:javascript
运行
复制
Resolver error at paths./testing.get.responses.200.schema.$ref
Could not resolve reference: Tried to resolve a relative URL, without having a basePath. path: './schema.json' basePath: 'undefined'.

我在网上查了这个问题,找不到任何明确的答案。我看到了一个解决方案,建议我应该将我的模式放在服务器上并使用URL地址访问它,但我不喜欢在这一点上这样做。

另外,在某个时候,我将方案保存在一个变量中,然后将其放入$ref中,它运行良好。唯一的问题是,这个方案包含了一些内部参考文件中的元素,Swagger无法解决这些问题。

有没有办法在swagger-ui-express中正确地使用$ref

EN

回答 2

Stack Overflow用户

发布于 2020-12-19 13:41:39

是否有一种方法可以在swagger-ui-express中正确地与$ref一起工作?

是的,您必须先自行解析YAML文件中的引用,然后向Swagger提供结果。您可以使用参参雅默吉库来完成这一任务。

下面的代码片段向您展示了如何做到这一点:

代码语言:javascript
运行
复制
const yamljs = require('yamljs');
const { resolveRefs } = require('json-refs');

/**
 * Return JSON with resolved references
 * @param {array | object} root - The structure to find JSON References within (Swagger spec)
 * @returns {Promise.<JSON>}
 */
const multiFileSwagger = (root) => {
  const options = {
    filter: ["relative", "remote"],
    loaderOptions: {
      processContent: function (res, callback) {
        callback(null, yamljs.parse(res.text));
      },
    },
  };

  return resolveRefs(root, options).then(
    function (results) {
      return results.resolved;
    },
    function (err) {
      console.log(err.stack);
    }
  );
};


const swaggerDocument = await multiFileSwagger(
  yamljs.load(path.resolve(__dirname, "./openapi/v1.yaml"))
);

您还可以使用完整的示例检查回购,该解决方案如何与swagger-ui-express:https://github.com/chuve/swagger-multi-file-spec一起工作。

票数 2
EN

Stack Overflow用户

发布于 2019-06-19 07:45:41

有同样的问题,找出你的问题。

我刚解决了我的问题所以我想我也许能帮上忙。

首先,你试过:

代码语言:javascript
运行
复制
schema:
      $ref: "schema.json"

没有.,这就是他们在文档方面的教学方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53968759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档