Koa2 接收post时,body值undefined

简介: 本来想通过koa快速搭建一个简单的服务时并测试文件上传的过程,然后使用postman请求时,获取上传的form-data中文件的水,ctx.request.body却一直是undefined?

前言

本来想通过koa快速搭建一个简单的服务时并测试文件上传的过程,然后使用postman请求时,获取上传的form-data中文件的水,ctx.request.body却一直是undefined?

搭建koa服务

安装koa :npm install koa

const Koa = require('koa');
const app = new Koa();
​
app.use(async ctx => {
  ctx.body = 'Hello World';
});
​
app.listen(3000);

进一步扩展,需要增加路由,请求解析,首先安装依赖包

  • koa-router
  • koa-body

然后就是监听端口,注册一个post请求,接收body参数输出结果,然而执行时,ctx.request.body一直都是undefined。

通过查看github上koa-body的demo,发现需要增加 multipart:true以支持form-data数据类型。添加后还是未能正确获取。

app.use(bodyParser({
    multipart:true,
}));

经过不断查询资料,学习到:

  • 模块 koa-router 是一个路由管理模块,当在浏览器上输入一个url时,就会指到其对应的的功能模块上。

    • router.post() / router.all() 是一个路由注册的过程。koa-router中提供两种方式注册路由:

      • 具体的HTTP动词注册方式,例如:router.get('/users', ctx => {})
      • 支持所有的HTTP动词注册方式,例如:router.all('/users', ctx => {})
  • 模块 koa-body 是,用于解析路由和请求体的参数,

所以,在注册路由前先使用 koa-body 中间件将无法解析之后的路由参数和请求体。

所以正确的代码:

const Koa = require("koa");
const Router = require("koa-router");
const bodyParser = require('koa-body');
const app = new Koa();
const router = new Router();
​
router.get("/", (ctx, next) => {
  ctx.body = "hi,南吕";
});
​
router.post("/upload", (ctx, next) => {
  const body =  ctx.request.body;
  console.log(body);
  ctx.body = { code: 1, message: "success" };
});
​
app.use(bodyParser({
    multipart:true,
}));
app.use(router.routes());
app.use(router.allowedMethods());
​
app.listen(3000, () => {
  console.log("start server http://localhost:3000");
});

反思:

  • 需要对koa执行过程深入学习
  • 在定位问题过程中,找到其问题的根源才能更好的解决问题

参考资料:

目录
相关文章
|
传感器
毕业设计 基于51单片机的智能水表水流量计流量报警器温度设计
毕业设计 基于51单片机的智能水表水流量计流量报警器温度设计
347 0
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
1047 1
|
数据采集 Python
python 如何url解码
【4月更文挑战第14天】
433 1
|
移动开发 小程序 API
uniapp中uview组件库的AlertTips 警告提示使用方法
uniapp中uview组件库的AlertTips 警告提示使用方法
638 2
|
JavaScript 前端开发 架构师
Node框架 【Egg-企业级框架】
Node框架 【Egg-企业级框架】
678 0
|
前端开发 算法 JavaScript
React项目input输入框输入自动失去焦点
本文讨论了在React项目中如何处理input输入框自动失去焦点的问题,特别是在移动端开发中。文章提供了一个使用React Native的TouchableWithoutFeedback组件来监听点击事件,并在事件处理函数中通过调用Keyboard.dismiss()方法使输入框失去焦点的示例代码。这种方法可以确保在用户点击页面其他区域时,键盘能够收起,输入框失去焦点。
456 1
React项目input输入框输入自动失去焦点
|
存储 前端开发 JavaScript
Webpack【Webpack中模式(Mode)、Webpack中使用DevServer、Webpack中devtool增强调试过程】(二)-全面详解(学习总结---从入门到深化)
Webpack【Webpack中模式(Mode)、Webpack中使用DevServer、Webpack中devtool增强调试过程】(二)-全面详解(学习总结---从入门到深化)
587 0
|
SQL 资源调度 前端开发
VUE3(三十四)项目启动sass报错
我有个不是很好的习惯,每天启动前端项目的时候,都会把项目中使用到的组件更新到最新的版本。其实这样是非常不好的。为什么呢?新版本除了修复之前的问题,也有可能会带来新的问题。 正常的做法大概是,等新版本发布了一段时间之后,再去更新,这样就相对保险一丢丢。 而且,目前前端项目中组件依赖太多,各个组件之间,难免会有兼容性的问题。今天在将组件更新到最新版本之后,启动项目,就遇到了问题。 报错如下: bash 复制代码 ERROR in ./src/pages/porder/index.scss (./node_modules/css-loader/dist/cjs.js!./node_modules/s
462 1
|
SQL 关系型数据库 MySQL
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
316 0
|
存储 前端开发 中间件
使用vue3+koa2对token的鉴权处理
使用vue3+koa2对token的鉴权处理
234 0
使用vue3+koa2对token的鉴权处理