博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
koa2学习笔记(四)GET和POST
阅读量:6053 次
发布时间:2019-06-20

本文共 2614 字,大约阅读时间需要 8 分钟。

GET

GET请求是前后端交互最常用的请求之一,常常用来进行查询操作。 那么Koa是如何接收并处理GET请求呢?

创建一个服务

const Koa = require('koa')const app = new Koa()app.use(async ctx => {    ctx.body = 'Hello World'})app.listen(8000)复制代码
  • 其中ctx是Koa2非常重要的一个上下文对象,可以把它理解为一个全局的顶层对象,Koa2里面绝大部分的属性和方法都可以通过ctx对象获取。
  • 其中ctx.body就是返回的html内容。
  • app.listen(...)是koa2的一个语法糖,等于运行了下面这两个方法,实质就是调用http模块创建一个监听端口的服务。
  • 每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数。
const http = require('http');http.createServer(app.callback()).listen(...);复制代码

接收请求

koa2每一个请求都会被传入到app.use()方法中,app.use会把请求信息放入到ctx中,我们可以从ctx中获取请求的基本信息。

app.use(async ctx => {    const url = ctx.url // 请求的url    const method = ctx.method   // 请求的方法    const query = ctx.query // 请求参数    const querystring = ctx.querystring // url字符串格式的请求参数    ctx.body = {        url,        method,        query,        querystring,    }})复制代码

现在访问localhost:8000?username=zj可以看到浏览器返回

{    "url": "/?username=zj",    "method": "GET",    "query": {        "username": "zj"    },    "querystring": "username=zj"}复制代码

POST

POST请求的数据实体,会根据数据量的大小进行分包传送。 当node.js后台收到post请求时,会以buffer的形式将数据缓存起来。Koa2中通过ctx.req.addListener('data', ...)这个方法监听这个buffer。 我们简单的看一下 同样先简单起一个服务:

const Koa = require('koa')const app = new Koa()app.use(async ctx => {    const req = ctx.request    const url = req.url // 请求的url    const method = req.method   // 请求的方法    ctx.req.addListener('data', (postDataChunk) => {        console.log('收到post数据 ---->' ,postDataChunk)    })    ctx.body = {        url,        method,    }})app.listen(8000)复制代码
// 可以使用xmind模拟post请求或者终端模拟$ curl -d 'test' http://localhost:8000复制代码

此时看到node后台打印:

收到post数据 ----> 
复制代码

解析数据

既然拿到了请求数据,那么解析数据就好办了。如果是普通的字符串,可以直接通过字符串拼接来获取。我们更新一下核心代码:

app.use(async ctx => {    const req = ctx.request    const url = req.url // 请求的url    const method = req.method   // 请求的方法    let post_data = ''    ctx.req.addListener('data', (postDataChunk) => {        console.log('收到post数据 ---->' ,postDataChunk)        post_data += postDataChunk    })    ctx.req.addListener('end', () => {        console.log('接收post数据完毕 ---->', post_data)    })    ctx.body = {        url,        method,    }})复制代码

还有一种最新的写法,推荐使用(这种方法需要引入koa-bodyparser包)

app.use(async ctx => {    const formdata = ctx.request.body //所有的请求都保存在里面        todosomething //做些你想做的事情。嘿嘿        return ctx.body = {        code: '200',        msg: formadata    }    })复制代码
我们把收到的数据,直接通过ctx.body 返回给前端。复制代码

总结

  • get的参数在ctx.request.query获取(这种方法需要引入koa-bodyparser包)
  • post的参数在ctxrequest.body获取(这种方法需要引入koa-bodyparser包)
  • post请求会被node.js缓存成多个buffer对象。
  • 字符串可以直接通过字符串拼接buffer对象来获取请求数据,但是文件类型的数据需要特殊的处理方式。

小强前端交流群QQ群:724179055

定时分析技术和资料,欢迎大家进来一起交流。

往期回顾地址:

转载地址:http://kmeex.baihongyu.com/

你可能感兴趣的文章
关于加载iframe时进度条不消失的问题
查看>>
poj 3984迷宫问题【广搜】
查看>>
oracle ORA-01840:输入值对于日期格式不够长
查看>>
python基础知识~logger模块
查看>>
新建Web网站与新建Web应用程序的区别
查看>>
SIP入门(二):建立SIPserver
查看>>
key 串口
查看>>
Servlet3.0的异步
查看>>
WebService连接postgresql( 失败尝试)
查看>>
从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?...
查看>>
Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
查看>>
从MFQ方法到需求分析
查看>>
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
LinkedHashMap源码分析(基于JDK1.6)
查看>>
访谈《敏捷和精益项目集管理》的作者Johanna Rothman
查看>>
将json文件导入到mongodb数据库
查看>>
MS UC 2013-2-Deploy Microsoft Exchange Server 2013-4-Post-Installation Tasks
查看>>