从nodejs/express项目中提供swagger-ui服务

3
我想使用 swagger-ui dist 的“原样”...几乎是原样。
我从 github 上下载了最新的版本(2.0.24),并将其放入我的应用程序的一个文件夹中。然后,我使用 express 静态服务器将其静态地提供出去:
app.use('/swagger', express.static('./node_modules/swagger-ui/dist'));

当我访问以下网址时,一切都如预期工作:

https://mydomain.com/swagger

我希望能够动态地向我的Swagger JSON填充URL字段。即,我可能部署到不同的域名下:

https://mydomain.com/api-docs
https://otherdomain.com/api-docs

当我访问时:

https://mydomain.com/swagger
https://otherdomain.com/swagger

我希望能够动态设置URL。
这是否可行?
3个回答

3
假设/api-docs(或swagger.json)始终位于相同的路径,并且只更改域名,您可以将SwaggerUi对象的url参数设置为"/path/to/api-docs"或"/path/to/swagger.json"而不是完整的URL。这将使UI将该路径作为相对于托管UI的域加载。
供参考,我也留下了原始答案,因为它可能在某些情况下证明有用。
您可以使用url参数设置UI应加载的URL。
也就是说,如果您将其托管在https://mydomain.com/swagger下,则可以使用https://mydomain.com/swagger?url=https://mydomain.com/api-docs和https://mydomain.com/swagger?https://otherdomain.com/api-docs来指向不同的位置。
然而,据我所知,这个功能仅在当前的alpha版本(应该足够稳定)中可用,而不是您使用的2.0.24版本(尽管值得测试)。

1
刚刚升级到2.1.alpha版本,因为我正在使用Swagger编辑器生成2.0文档。谢谢! - lostintranslation
感谢@webron。然而,我仍然不确定在express中有没有一种方法可以使用参数提供静态文件。再次,更想知道如何修改app.use('/swagger',express.static('./node_modules/swagger-ui/dist')),以包括url参数。看起来更像是重定向,不确定我是否可以在express.static中这样做。 - lostintranslation
1
这不是URL的参数,你需要修改index.html,具体来说,https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html#L34。由于它是您应用程序的一部分,因此修改它应该没有问题(您可能已经做过了)。 - Ron
1
我必须承认@webron的观点。Swagger-ui就像AngularJS一样是一个库,只是它恰好带有一个可工作的默认实现。如果你看一下这个实现,你会发现实现背后是调用SwaggerUi构造函数和@webron所提到的url参数。事实上,在swagger-tools' swagger-ui middleware中,我正在做@webron建议的事情。 - Jeremy Whitlock
1
继续上文...在swagger-tools的swagger-ui中间件中,我想根据我检索到的标头设置URL,以便服务器可以指定值。这与您想要做的非常相似。 - Jeremy Whitlock
显示剩余4条评论

0
另一种方法是使用位于swagger-tool中的swagger-ui中间件。
let swaggerUi = require('../node_modules/swagger-tools/middleware/swagger-ui');
app.use(swaggerUi(config.swagger));

变量 config.swagger 包含了 swagger.yaml 或者 swagger.json。在我的设置中,我有这个。

  let config = {
      appRoot: __dirname,
      swagger: require('./api/swagger/swagger.js')
  };

注意: 我正在使用require('swagger-express-mw')模块


0
你可以尝试在swagger-ui的index.html文件中使用这个方法... 这对我有效。
if (url && url.length > 1) {
   url = decodeURIComponent(url[1]);
} else {
   url = window.location.origin + "/path/to/swagger.json";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接