Deno Oak服务器POST请求获取请求体后无法返回响应的问题
Deno Oak POST请求获取请求体后无法收到响应的解决方法
你遇到的问题核心是路由中间件的顺序错误,以下是具体修正方案:
问题原因
Oak框架中,router.allowedMethods() 必须放在 router.routes() 之后执行。如果顺序颠倒,路由匹配后的响应会被 allowedMethods 中间件拦截,导致客户端无法接收返回内容。另外,当你把 ctx.response.body 设置为对象时,Oak会自动将响应的 Content-Type 设为 application/json,手动设置 ctx.response.type = "json" 属于冗余操作,可省略。
修正后的代码
const loginEp = async (ctx) => { if (!ctx.request.hasBody) { ctx.throw(415); } const reqBody = await ctx.request.body({ type: 'json' }).value; console.log(reqBody, typeof reqBody); ctx.response.status = 200; ctx.response.body = { key_one: "One" }; }; const router = new Router(); router.post("/api/login", loginEp); // 修正中间件顺序:先注册路由,再处理允许的方法 app.use(router.routes()); app.use(router.allowedMethods());
测试验证
用你原来的curl命令测试,现在能正常收到响应:
curl --header "Content-Type: application/json" \ --request POST \ --data '{"login":"test","password":"test123"}' \ http://localhost:8010/api/login
返回结果应为:{"key_one":"One"}
额外说明
- 路由处理函数如果不需要将请求传递到下一个中间件,可省略
next参数和await next()调用 - 若需处理其他类型请求体(如form-data),只需调整
ctx.request.body的type参数即可
内容的提问来源于stack exchange,提问作者QSpider
相关产品推荐
相关产品推荐

