我有一个用NodeJS编写的KoaJS应用程序,
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中重新创建了应用程序,它在运行和函数中都很好地工作。
然而,我真的很喜欢本地的async/await
,compose routing
of KoaJS
有人知道为什么KoaJS不能处理云函数上的POST请求吗?
发布于 2022-05-02 11:54:32
json主体在google (文档)中被自动解析,而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())
https://stackoverflow.com/questions/71283981
复制相似问题