我开始在swagger-ui-express和 swagger -jsdoc中使用swagger来自动记录我现有的API,它是用nodejs和express编写的(如这里描述的- 示例)。
当我试图在注释中将$ref
添加到现有的JSON文件(与所有js文件位于我的项目所在的目录中)时,我遇到了一个问题。
我试着编写本地路径(./schema.json
)和绝对路径,尝试使用#
,使用了许多语法,但什么也没有成功。
我的注释如下所示:
/**
* @swagger
* /testing:
* get:
* description: This should show the json schema
* responses:
* 200:
* description: "successful operation"
* schema:
* $ref: "./schema.json"
*/
我希望swagger用户界面在我的请求部分向我展示JSON模式。我得到了以下错误-
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
?
发布于 2020-12-19 13:41:39
是否有一种方法可以在swagger-ui-express中正确地与$ref一起工作?
是的,您必须先自行解析YAML文件中的引用,然后向Swagger提供结果。您可以使用参参和雅默吉库来完成这一任务。
下面的代码片段向您展示了如何做到这一点:
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一起工作。
发布于 2019-06-19 07:45:41
有同样的问题,找出你的问题。
我刚解决了我的问题所以我想我也许能帮上忙。
首先,你试过:
schema:
$ref: "schema.json"
没有.
,这就是他们在文档方面的教学方式。
https://stackoverflow.com/questions/53968759
复制相似问题