前言
本来想通过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执行过程深入学习
- 在定位问题过程中,找到其问题的根源才能更好的解决问题
参考资料: