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执行过程深入学习
  • 在定位问题过程中,找到其问题的根源才能更好的解决问题

参考资料:

目录
相关文章
|
4月前
|
JavaScript 前端开发
js获取url参数值的几种方式
js获取url参数值的几种方式
传参接受res.data数值,如何将获取request的请求进行传参
传参接受res.data数值,如何将获取request的请求进行传参
|
JavaScript
node.js如何获取post和get请求的参数
node.js如何获取post和get请求的参数
101 0
|
JavaScript 前端开发 API
JS method请求方式的应用
JS method请求方式的应用
76 0
|
7月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
76 0
|
编解码 前端开发 Java
axios 传递参数的方式(data 与 params 的区别)
axios 大家都非常的清楚,一个既可以用于客户端或者 服务端发送http请求的库。但是在前后端联调的时候有的时候会很难受,所以这里我来做一个总结。希望能帮助到有缘人。
axios 传递参数的方式(data 与 params 的区别)
|
XML JSON 数据格式
【Gin】gin json渲染,获取querystring参数,获取form参数,获取path参数,参数绑定
访问:http://localhost:9090/user?username=dahe&password=admin 控制台输出:main.UserInfo{Username:“dahe”, Password:“admin”} ShouldBind会按照下面的顺序解析请求中的数据完成绑定: 如果是 GET 请求,只使用 Form 绑定引擎(query)。 如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。
226 0
【Gin】gin json渲染,获取querystring参数,获取form参数,获取path参数,参数绑定
|
前端开发
fetch 配合 express 使用req body为空
最近用 node 写后端接口 前端使用fetch,遇到个问题记录如下 使用fetch进行post请求的时候,后端node 使用express框架进行body接收的时候始终是个空对象 {}
593 0
fetch 配合 express 使用req body为空
|
JSON 前端开发 中间件
BUG排查-koa2中koa-body和koa-bodyparser共用时POST会出现超时
周日有个小伙加我,帮他排查了一下问题。正好记录一下。 前端是:axios 后台是:koa2 问题:axios 发 post 请求不携带参数请求正常,携带参数就无响应。 因为我也不知道小伙那些说的是真的,那些是假的,那我们就一点一点排查,我大致定位问题为以下几个方向。 参数携带不正确,axios 发过去的数据是错的,比如说被 {id: 1} 却发送的 [object Object] 参数携带不正确,比如说后台只接收 appliction/json、application/x-www-form-urlencoded、multipart/form-data 其中一种 这流程没毛病吧,先找前端自
444 0
BUG排查-koa2中koa-body和koa-bodyparser共用时POST会出现超时
|
JavaScript
通过JS获取URL携带的参数
通过JS获取URL携带的参数
141 0