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

使用Deno和Oak开发RESTApi遇TypeError:ctx.request.body不是函数

解决Deno + Oak开发REST API时ctx.request.body is not a function错误

问题描述

使用Deno和Oak v16.0.0开发简单REST API时,POST接口触发如下错误:

TypeError - ctx.request.body is not a function
request: { url: "http://localhost:8000/todos", method: "POST", hasBody: true }
response: { status: 500, type: "text", hasBody: true, writable: true }

报错代码位于POST接口逻辑中:

import { Router } from 'https://deno.land/x/oak@v16.0.0/mod.ts';
const router = new Router();

interface Todo {
  id: string;
  text: string;
}

let todos: Array<Todo> = [];

router.get('/todos', (ctx, _) => {
  ctx.response.body = { todos: todos };
});

router.post('/todos', async (ctx) => {
  const reqBody = await ctx.request.body(); // 此处报错
  console.log(reqBody);
});

router.put('/todos/:todoId', (ctx, _) => {});

router.delete('/todos/:todoId', (ctx, _) => {});

export default router;

app.ts文件内容:

import { Application } from 'https://deno.land/x/oak/mod.ts';
import todoRoutes from './routes/todos.ts';

const app = new Application();

app.use(todoRoutes.routes());
app.use(todoRoutes.allowedMethods());

await app.listen({ port: 8000 });

错误原因

你使用的是Oak v16.0.0,该版本对请求体的处理逻辑做了重大变更:

  • Oak v15及更早版本中,ctx.request.body()是一个异步函数,调用后返回请求体解析结果
  • Oak v16+版本中,ctx.request.body不再是可调用的函数,而是一个Body对象,需要通过对象的专属方法来解析请求体

网上资料使用ctx.request.body()是因为它们基于旧版本Oak,版本差异导致用法不兼容。

解决方法

根据请求体的格式,使用Body对象对应的解析方法:

  • JSON格式请求体用json()方法
  • 纯文本请求体用text()方法
  • 表单数据用formData()方法

修改后的POST接口代码示例:

router.post('/todos', async (ctx) => {
  // 解析JSON格式的请求体
  const reqBody = await ctx.request.body.json();
  console.log(reqBody);
  // 新增todo逻辑示例
  const newTodo: Todo = {
    id: crypto.randomUUID(),
    text: reqBody.text
  };
  todos.push(newTodo);
  ctx.response.status = 201;
  ctx.response.body = { todo: newTodo };
});

内容的提问来源于stack exchange,提问作者Shivam Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:27:15