使用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
相关产品推荐
相关产品推荐

