# 一、描述
koa 处理 post 请求的时候,需要对 body 传递过来的数据进行处理。
实际上如果要手动实现一个能够处理 application/x-www-from-urlencoded 的中间件,还是借助的原生 node.js 的方法进行处理。
koa 封装了原生了 node.js 的 request 对象到 ctx.req 中。
而借助原生 node.js 的 request 对象,监听 data 事件及 end 事件,进行处理。
# 二、实现中间件
# 1、实现 listen 监听 body 数据传输
当 body 数据传输结束后,将拼接的字符串进行解析,解析之后,将 Promise resolve 即可。
function listen(ctx){  | |
let str = '';  | |
return new Promise((resolve,reject) => {  | |
ctx.req.addListener('data',(data)=>{  | |
str += data;  | |
});  | |
ctx.req.addListener('end',()=>{  | |
const res = jsonBodyparser(str);  | |
resolve(res);  | |
});  | |
});  | |
} | 
# 2、将字符串解析成对象
处理拼接的字符串很简单,我用了最简单的方式,就是拆分遍历字符串。
function jsonBodyparser(str){  | |
let parseBody = {};  | |
let strArr = str.split('&');  | |
for(let [index,item] of strArr.entries()){  | |
const itemArr = item.split("=");  | |
parseBody[itemArr[0]] = itemArr[1];  | |
  } | |
return parseBody;  | |
} | 
# 3、export 中间件
参照了 koa-bodyparser 中间件实现方式,将结果封装进了 ctx.request.body 中
module.exports = () => {  | |
return async (ctx, next) => {  | |
bodyParser = await listen(ctx);  | |
ctx.request.body = bodyParser;  | |
await next();  | |
  } | |
} | 
# 三、 使用中间件
const Router = require('koa-router');  | |
const fs = require('fs');  | |
const path = require('path');  | |
const postBodyParser= require('../middlewares/postBodyParser');  | |
const router = new Router();  | |
router.use(postBodyParser());  | |
router.get('/',async (ctx)=>{  | |
const htm = fs.readFileSync(path.resolve('./views/login.html')).toString();  | |
ctx.body = htm;  | |
}).post('/',async (ctx)=>{  | |
ctx.body = ctx.request.body;  | |
});  | |
module.exports = router;  | 
# 四、使用 koa-bodyparser
如果使用 koa-bodyparser ,则非常方便而且考虑的方面也更多。
# 1、安装
yarn add koa-bodyparser
# 2、引入
const Koa = require('koa');  | |
const Router = require('koa-router');  | |
const bodyParser = require('koa-bodyparser');  | |
const router = require('./routes/index');  | 
# 3、使用
接上面 【 引入 】
const app = new Koa();  | |
app.use(bodyParser());  | |
app.use(router.routes()).use(router.allowedMethods());  | |
app.listen(5000,()=>{  | |
console.log('start : 5000');  | |
});  |