在 Firebase Functions 服务器中设置 Swagger Ui

Jua*_*pez 2 node.js firebase swagger-ui google-cloud-functions

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

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

假设我的云函数的名称是 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
        }
    })
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jua*_*pez 5

找到解决方案

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

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

希望这对其他人有帮助!

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