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())
我有一个用 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())