繁体   English   中英

在 Firebase Functions 服务器中设置 Swagger Ui

[英]Setting up Swagger Ui in Firebase Functions Server

我在 Firebase Cloud Functions 上开发了一个 API,我想在其中包含一个文档路径。 我正在使用 swagger,我可以在本地成功测试它 (localhost:PORT/docs),但是当我将该函数部署到 Firebase 时它不起作用,它会将我重定向到授权页面。

我想我明白这是为什么了:

假设我的 Cloud 函数的名称是 cfunc。 然后它的基本 url 类似于https://region-name-project-name.cloudfunctions.net/cfunc 根据我如何包含 swagger 文档:

const swaggerDoc = require('./docs/swagger.config.json')
app.use(
    '/docs',
    allowCors,
    swaggerUi.serve,
    swaggerUi.setup(swaggerDoc, {
        customCssUrl: '/assets/swagger.css',
        customSiteTitle: 'My Function Title',
        customfavIcon: '/assets/logo.ico',
        swaggerOptions: {
            supportedSubmitMethods: [] //to disable the "Try it out" button
        }
    })
)

文档应位于https://region-name-project-name.cloudfunctions.net/cfunc/docs 当我尝试访问该 URL 时,在我的浏览器 DevTools 中查看“网络”,它会尝试在该 URL 上进行 GET 响应 304,然后重定向到https://region-name-project-name.cloudfunctions.net/docs ,这就是是什么打开了 Google 身份验证页面,因为没有名为“docs”的 Cloud Function,因此 Google 认为我正在尝试访问 Firebase Cloud Functions 中的其他内容(如果我执行类似https://region-name-的操作,也会发生同样的事情)项目名称.cloudfunctions.net /tomato )

但我仍然不知道如何修复此重定向或为什么会发生这种情况。 我尝试将 Cloud Function URL 添加到 swagger.config.json 文件的主机参数,并对 CORS 进行了一些修改,例如允许更多请求方法、添加 json 作为内容类型、允许对标头进行身份验证,但似乎没有任何效果。

希望我足够清楚,如果没有告诉我你需要的任何其他信息(这是我在这里的第一篇文章之一:B)

找到解决方案

在测试了一堆不同的东西之后,我发现重定向实际上总是在删除路径的一部分之后发生,例如,我将文档端点更改为“/something/docs”,并且在访问https的 URL 时://region-name-project-name.cloudfunctions.net/cfunc/something/docs它重定向到https://region-name-project-name.cloudfunctions.net/cfunc/docs没有启动谷歌身份验证东西,但现在不是我的文档的有效路径,所以它返回了“无法获取/cfunc/docs”。

出于某种原因,如果您在文档 URL 的末尾添加额外的正斜杠 ('/'),则不会发生这种重定向。 因此,在第一种情况下,文档的端点仅为“/docs”,访问 URLhttps://region-name-project-name.cloudfunctions.net/cfunc/docs/即可。 我不知道为什么会这样,我可能会在 swagger repo 上发布一个 Issue,但是如果有人有一些关于为什么或如何让它工作的额外数据,那么听到它会很棒。

希望这可以帮助别人!

编辑:哦,还有一件事我忘了,如果你像使用 express Router 一样设置 swagger-ui 显然更好,即使你不是(也许 Firebase 使用路由器之类的东西加载 Cloud Function),而不是app.use('/docs', swagger-ui.serve, swagger-ui.setup(swagger-file))app.use('/docs', swagger-ui.serve)然后app.get('/docs', swagger-ui.setup(swagger-file))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM