You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:10:32