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)
找到解决方案
在测试了一堆不同的东西之后,我发现重定向实际上总是在删除路径的一部分之后发生,例如,我将文档端点更改为“/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))
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |