1.0 前言

我们一般常用 get, post 请求的方式从页面带参数,数据到服务端,服务端获取这些参数后,做各种处理,这节我们学习怎么获取这些参数。

2.0 Get 请求数据获取

在 Koa 中,获取 Get 请求数据源头是 Koa 中 Request 对象中的 query 方法或 querystring 方法,query 返回是格式化好的参数对象,querystring 返回的是请求字符串,事例代码如下:

  1. // 请求 http://localhost:8080/user/detail?userName=123&id=1
  2. // controller/user.js
  3. function getUser(ctx) {
  4. ctx.query //返回 { userName:123, id: 1 }
  5. ctx.request.query //返回 { userName:123, id: 1 }
  6. ctx.querystring // 返回 userName=123&id=1
  7. ctx.request.querystring // 返回 userName=123&id=1
  8. }

3.0 路由参数获取

我们在请求的时候经常会使用 `http://localhost:8080/user/detail/${userId}` 这种方式获取数据,这种路由风格看起来非常直观,这种我们通过 ctx.param 获取。

  1. // router.js
  2. const { detail } = require('./controller/user')
  3. router.get('/user/detail/:id', detail)

4.0 Post 请求参数获取

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

  1. // router.js
  2. const {
  3. list,
  4. detail,
  5. add
  6. } = require('./controller/user')
  7. router.post('/user/add', add)
  8. // controller/user.js
  9. function add(ctx) {
  10. const getData = () => {
  11. return new Promise((resolve, reject) => {
  12. try {
  13. let postdata = "";
  14. ctx.req.addListener('data', (data) => {
  15. postdata += data
  16. })
  17. ctx.req.addListener("end",function(){
  18. let parseData = parseQueryStr( postdata )
  19. resolve( parseData )
  20. })
  21. } catch ( err ) {
  22. reject(err)
  23. }
  24. })
  25. }
  26. return getData().then(data => {
  27. console.log(data)
  28. array.push({
  29. id: array.length,
  30. ...data
  31. })
  32. ctx.body = {
  33. success: true
  34. }
  35. })
  36. }
  37. function parseQueryStr( queryStr ) {
  38. let queryData = {}
  39. let queryStrList = queryStr.split('&')
  40. console.log( queryStrList )
  41. for ( let [ index, queryStr ] of queryStrList.entries() ) {
  42. let itemList = queryStr.split('=')
  43. queryData[ itemList[0] ] = decodeURIComponent(itemList[1])
  44. }
  45. return queryData
  46. }

可以查看 demo http://localhost:3000/ ,查看具体效果。
image.png

5.0 koa-bodyparser 中间件

对于 Post 请求的处理,koa-bodyparser 中间件可以把Koa 上下文的 formData 数据解析到ctx.request.body 中。

安装依赖

  1. npm install --save koa-bodyparser

使用中间件

  1. // app.js
  2. const Koa = require('koa')
  3. const app = new Koa()
  4. const bodyParser = require('koa-bodyparser')
  5. app.use(bodyParser())
  6. // controller/user.js
  7. function add(ctx) {
  8. const postData = ctx.request.body //
  9. }

可以看到使用中间件会方便很多,减少大段代码。

6.0 总结

这节我们学习了,在 Get,Post 请求中如何获取数据,日常开发中使用非常多,大家可以仔细看看,Demo 地址