【问题标题】:POST request hangs (timeout) when trying to parse request body, running Koa on Firebase Cloud Functions尝试解析请求正文时,POST 请求挂起(超时),在 Firebase Cloud Functions 上运行 Koa
【发布时间】:2020-02-02 20:17:43
【问题描述】:

我正在开发一个小型网站,使用 Firebase 托管 (FH) 提供静态文件,并将所有请求重写到 Firebase Cloud Functions (FCF) 上的单个函数,我使用 Koa(带有 koa-router)来处理请求。但是,当我尝试使用 koa-bodyparser 解析 POST 请求的主体时,服务会一直挂起,直到最终超时。

使用其他 body 解析器(例如 koa-body)时也会发生同样的情况,并且无论我将解析器放在哪里,它似乎都会持续存在,除非我将它放在路由器之后,在这种情况下问题就消失了,虽然我仍然无法访问数据,因为它永远没有机会被解析(?)。

以下是导致问题的代码的精简版本:

import * as functions from 'firebase-functions'
import * as Koa from 'koa'
import * as KoaRouter from 'koa-router'
import * as KoaBodyParser from 'koa-bodyparser'

const app = new Koa()
const router = new KoaRouter()

app.use(KoaBodyParser())

router.post('/', (context) => {
  // do some stuff with the data
})

app.use(router.routes())

export const serve = functions.https.onRequest(app.callback())

我对所有这些工具还是很陌生,我可能遗漏了一些非常明显的东西,但我似乎无法在任何地方找到解决方案。如果我没记错的话,FCF 会自动解析请求,但 Koa 无法访问该数据,除非它自己解析,所以我认为 FCF 的自动解析和 Koa 使用的解析器之间出现了问题。

除了网关超时 (504) 之外,我无法生成任何实际错误或有用的错误消息,因此我没有太多工作要做,也无法为您提供更多比我已经拥有的。

如何获取数据?

【问题讨论】:

    标签: node.js typescript firebase google-cloud-functions koa


    【解决方案1】:

    Firebase 已经解析了正文。
    https://firebase.google.com/docs/functions/http-events#read_values_from_the_request

    似乎提供的 Koa 正文解析中间件不知道如何处理“已解析”的正文(即对象与未解析的字符串),因此中间件最终会变得混乱并执行某种无限循环。

    一种解决方案是使用 ctx.req.body,因为它已经被解析。 :)

    考阿岩石!

    【讨论】:

    • 谢谢你。我为此花费了一整天的时间。这需要更多的关注。
    • 奇怪的是,这会导致无限循环。这也不仅仅归于 Koa - 我从 NextJS 那里得到了这个答案,它具有完全相同的行为,但有一个非常不同的解决方案。如果您使用 NextJS,请查看此答案:stackoverflow.com/a/63975702/2738164
    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2020-09-12
    • 2021-08-22
    • 2015-01-14
    • 2022-01-25
    相关资源
    最近更新 更多