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 API
前端Get请求能在body上传参吗
【10月更文挑战第11天】 在浏览器环境中,GET请求的body参数会被忽略,这是因为浏览器中的XHR和fetch实现限制了这一行为。而在Node.js服务端环境中,GET请求可以在body中传递参数,因为服务端请求库没有这样的限制。实际上,GET请求不带body是HTTP标准的一部分,但在某些场景下,为了遵循RESTful规范,可以考虑通过服务端转发或BFF模式来实现复杂的参数传递。
传参接受res.data数值,如何将获取request的请求进行传参
传参接受res.data数值,如何将获取request的请求进行传参
|
JavaScript
node.js如何获取post和get请求的参数
node.js如何获取post和get请求的参数
112 0
|
9月前
|
JavaScript
Vue Router params 参数接收为空
Vue Router params 参数接收为空
176 0
|
9月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
81 0
|
前端开发
ajax 返回undefined 或则[object object]的调试方式
ajax 返回undefined 或则[object object]的调试方式
123 0
|
编解码 前端开发 Java
axios 传递参数的方式(data 与 params 的区别)
axios 大家都非常的清楚,一个既可以用于客户端或者 服务端发送http请求的库。但是在前后端联调的时候有的时候会很难受,所以这里我来做一个总结。希望能帮助到有缘人。
axios 传递参数的方式(data 与 params 的区别)
|
存储 前端开发
AJAX问题 XMLHttpRequest.status = 0是什么含义
在调用AJAX的时候遇到了XMLHttpRequest. status为0 的情况,http协议里可是没这个状态码的,众所周知,XMLHttpRequest. Status为HTTP请求状态码,一般为1xx-5xx,这个0是什么含义,让我觉得很好奇。
4003 0
|
前端开发
fetch 配合 express 使用req body为空
最近用 node 写后端接口 前端使用fetch,遇到个问题记录如下 使用fetch进行post请求的时候,后端node 使用express框架进行body接收的时候始终是个空对象 {}
610 0
fetch 配合 express 使用req body为空
|
前端开发 JavaScript 数据格式
学习AJAX必知必会(4)~JQuery发送Ajax请求、ajax使用fetch函数(返回值是Promise对象)
学习AJAX必知必会(4)~JQuery发送Ajax请求、ajax使用fetch函数(返回值是Promise对象)
263 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等