koa 获取post请求

目录

 

原理:

注意:

实例:


原理:

对于POST请求的处理,koa2没有封装获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req,将POST表单数据解析成query string(例如:a=1&b=2&c=3),再将query string 解析成JSON格式(例如:{"a":"1", "b":"2", "c":"3"})

注意:

       ctx.request是context经过封装的请求对象,ctx.req是context提供的node.js原生HTTP请求对象,同理ctx.response是context经过封装的响应对象,ctx.res是context提供的node.js原生HTTP请求对象。

实例:

   

const Koa = require('koa')
const app = new Koa()

app.use( async ( ctx ) => {
    if ( ctx.url === '/' && ctx.method === 'GET' ) {
        // 当GET请求时候返回表单页面
        let html = `
      <h1>koa2 request post demo</h1>
      <form method="POST" action="/">
        <p>userName</p>
        <input name="userName" /><br/>
        <p>nickName</p>
        <input name="nickName" /><br/>
        <p>email</p>
        <input name="email" /><br/>
        <button type="submit">submit</button>
      </form>
    `
        ctx.body = html
    } else if ( ctx.url === '/' && ctx.method === 'POST' ) {
        // 当POST请求的时候,解析POST表单里的数据,并显示出来
        let postData = await parsePostData( ctx )
        ctx.body = postData
    } else {
        // 其他请求显示404
        ctx.body = '<h1>404!!! o(╯□╰)o</h1>'
    }
})
/**
 * 解析上下文里node原生请求的post参数
 * */

function parsePostData(ctx){
    return new Promise((resolve,reject)=>{
        try {
            console.log(ctx.req === ctx.request)
            let postData = '';
            ctx.req.addListener('data',(data)=>{
                postData += data;
            })
            ctx.req.addListener('end',()=>{
                let parseData = parseQueryStr(postData);
                resolve(parseData)
            })
        }catch (err) {
            reject(err)
        }
    })
}

/**
 * 将POST请求的参数字符串解析成json
 */

function parseQueryStr(queryStr) {
    console.log('queryStr',queryStr)
      let queryData = {};
      let queryStrList = queryStr.split('&');
      console.log(queryStrList);
      for(let [index,queryStr] of queryStrList.entries()){
          console.log(index,queryStr)
          let itemList = queryStr.split('=');
          queryData[itemList[0]] = decodeURIComponent(itemList[1]);
      }
      return queryData
}

app.listen(3000, () => {
    console.log('[demo] request post is starting at port 3000')
})

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值