# 一、描述

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');
});