# 一、描述
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'); | |
}); |