我在Firebase Cloud Functions上开发了一个API,我想包含一个docs路径。我使用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上使用响应304进行GET,然后重定向到https://region-name-project-name.cloudfunctions.net/docs,这就是Google身份验证页面的弹出内容,因为没有名为“docs”的云函数,所以Google认为我正在尝试访问Firebase云函数中的其他内容(如果我执行类似https://region-name-project-name.cloudfunctions.net/tomato的操作,也会发生同样的情况)
但我仍然不知道如何修复这个重定向,也不知道为什么会发生这种情况。我尝试将Cloud Function URL添加到swagger.config.json文件的host参数中,并对CORS进行一些修改,如允许更多的Request Methods,添加json作为内容类型,允许对标头进行身份验证,但似乎没有任何效果。
希望我说的够清楚了,如果没有告诉我你需要的其他信息(这是我在这里的第一篇文章之一:B)
1条答案
按热度按时间vs3odd8k1#
找到解决方案
在测试了一堆不同的东西之后,我发现重定向实际上是在总是删除路径的一个切片之后发生的,例如,我将docs端点更改为“/something/docs”,当访问https://region-name-project-name.cloudfunctions.net/cfunc/something/docs的URL时,它重定向到https://region-name-project-name.cloudfunctions.net/cfunc/docs,这不会带来Google身份验证,但现在不是我的docs的有效路径,因此它返回"无法获取/cfunc/docs '。
由于某种原因,如果添加额外的正斜杠,则不会发生此重定向('/')在文档URL的末尾。所以,在第一种情况下,文档的端点只有'/docs',访问URL https://region-name-project-name.cloudfunctions.net/cfunc/docs/就可以了。我不知道为什么,我可能在swagger repo上发布了一个问题,但是,如果有人有一些额外的数据,为什么或如何使它工作,否则这将是可怕的听到。
希望这对其他人有帮助!
编辑:哦,还有一件事我忘了,如果你设置swagger-ui as if you were using express Router显然会更好,即使你不是(也许Firebase用路由器之类的东西加载云功能),所以不要用
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))