KoaJs 无法处理 CloudFunctions 上的 POST 请求

KoaJs cant handle POST requests on CloudFunctions

我有一个用 KoaJS

编写的 NodeJS 应用程序

app.ts

const app = new Koa();

app.use(healthCheck());
app.use(bodyParser());
app.use(errorHandler());
app.use(endpoints);

export default app;

main.ts

const port = process.env.PORT || 3000;

if (!isCloudFunctions()) {
    app
        .listen(port, () => {
            console.info(`Listening at http://localhost:${port}`);
        })
        .on('error', console.error);
}

export const api = (req, res) => {
    app.callback()(req, res);
}

该应用在 Cloud Runs 上运行良好, 我可以在 Cloud Functions 上部署该应用程序,但在 Functions 上该应用程序只能处理 GET 请求。 如果我尝试 POST 请求,我会收到此错误

InternalServerError: stream is not readable
at getRawBody (/workspace/node_modules/raw-body/index.js:112:10)
at readStream (/workspace/node_modules/raw-body/index.js:178:17)
at AsyncFunction.module.exports [as json] (/workspace/node_modules/co-body/lib/json.js:39:21)
at executor (/workspace/node_modules/raw-body/index.js:113:5)
at parseBody (/workspace/node_modules/koa-bodyparser/index.js:100:26)
at new Promise (<anonymous>)
at bodyParser (/workspace/node_modules/koa-bodyparser/index.js:85:25)
at next (/workspace/node_modules/koa-compose/index.js:42:32)
at /workspace/webpack:/sample-explore/apps/sample-api/src/middlewares/health-check.ts:10:12
at Generator.next (<anonymous>)

我在 ExpressJS 中重新创建了应用程序,它在 Runs 和 Functions 上运行良好

不过我真的很喜欢KoaJS

的原生async/await,compose routing

有谁知道 KoaJS 无法处理 POST Cloud Functions 请求的原因?

json 主体在 google 云函数 (documentation) 中自动解析,koa-bodyparser 中间件无法处理已解析的主体。

有关此问题的更多信息:https://github.com/koajs/bodyparser/issues/127

来自问题线程的建议修复是使用 ctx.req.body 而不是 ctx.request.body,当然,您需要在本地 运行 时解析它。 或者添加一个支持已解析主体的中间件。

function hybridBodyParser (opts) {
  const bp = bodyParser(opts)
  return async (ctx, next) => {
    ctx.request.body = ctx.request.body || ctx.req.body
    return bp(ctx, next)
  }
}

app.use(hybridBodyParser())