koa2學習筆記(四)GET和POST

GET

GET請求是先後端交互最經常使用的請求之一,經常用來進行查詢操做。 那麼Koa是如何接收並處理GET請求呢?html

建立一個服務前端

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中獲取請求的基本信息。node

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數據 ----> <Buffer 74 65 73 74>
複製代碼

解析數據

既然拿到了請求數據,那麼解析數據就好辦了。若是是普通的字符串,能夠直接經過字符串拼接來獲取。咱們更新一下核心代碼:bash

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包)session

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羣:724179055app

定時分析技術和資料,歡迎你們進來一塊兒交流。koa

往期回顧地址:

相關文章
相關標籤/搜索