用筷子接收请求并响应 json 数据

描述请求?

当提到一个请求,我们平时怎么描述?

  • 路径,比如 /home/user
  • 方法,比如 getpostdelete
  • 路径参数,比如 /home/user?id=3,其中 id: 3 就是路径参数
  • json 数据
  • ...

handler

使用筷子时,你只需要写一个方法,然后告诉筷子:

这个方法处理什么样的请求就行了

大家经常把处理请求的方法,叫做 handler

上码

  1. const { server, router } = require('kuaizi')
  2. router.addHandler({
  3. path: '/hello',
  4. handler() {
  5. return 'hi yo~'
  6. }
  7. })
  8. server.start(8888)

先不管上面写了啥,先运行一下吧!你应该会看到:

  1. 2021-02-15T12:09:04.744Z 收集到路由:GET /hello
  2. 2021-02-15T12:09:04.821Z started on 8888

这就表明你的第一个筷子程序跑了起来

打开浏览器,访问 http://localhost:8888/hello

你应该会看到 { "errCode": 0, "data": "hi yo~" }

我想,如果你熟悉网站开发,应该大致知道上面的代码做了什么

  • 第一行:加载筷子
  • 第二行:空行
  • 第三行:向 router 对象,添加了一个 handler
  • 第五~六行:是处理请求的 handler
  • 第四行:声明这个 handler 处理路径为 /hello 的请求
  • 第十行:启动一个 http 服务器,监听 8888 端口

再看刚刚的 handler,它只返回了一个字符串 hi yo~

也就是你访问过 http://localhost:8888/hello,所返回的

你可以试试修改一下这个字符串

http 方法呢?

如果你不明说,筷子会把新添加的 handler 用来处理get 类型的请求

如果你想让这个 handler 处理 post 请求,只需要在 path: '/hello' 上面加一行 method: 'post'

  1. const { server, router } = require('kuaizi')
  2. router.addHandler({
  3. method: 'post',
  4. path: '/hello',
  5. handler() {
  6. return 'hi yo~'
  7. }
  8. })
  9. server.start(8888)

挺简单的吧!

解析请求里的数据

很多时候,发来的请求里会带有数据,比如:

路径参数

往宽了说,写在路径里的参数都是路径参数

比如,假定有这样一个请求链接:http://localhost:8888/user?id=2333

意图很明显:它想获取 id 为 2333 的用户的信息

看看筷子怎么处理:

  1. const { server, router } = require('kuaizi')
  2. router.addHandler({
  3. path: '/user',
  4. handler(ctx){
  5. let param = ctx.getParam()
  6. return `你想获取 id 为 ${ param.id } 的用户的信息`
  7. }
  8. })
  9. server.start(8888)

你只需要把目光聚焦在 4~7 行:

  • 第四行:这个 handler 处理路径为 /user 的请求
  • 潜台词:默认处理 get 类型的请求
  • 第五行:和之前不一样,这个 handler 多了一个参数 ctx
  • 第六行:调用了 ctx 的 getParam 方法,获取到了全部的“路径参数”
  • 第七行:……

重新运行一下,快试试 http://localhost:8888/user?id=2333

json 数据

假如前端传来了 json 数据,可以这样:

  1. const { server, router } = require('kuaizi')
  2. router.addHandler({
  3. method: 'post',
  4. path: '/user',
  5. async handler(ctx){
  6. let data = await ctx.getJson()
  7. console.log(data)
  8. return {
  9. msg: '你似乎上传了一个用户的数据',
  10. data: data
  11. }
  12. }
  13. })
  14. server.start(8888)

可以看到,ctx 对象上还有一个 getJson 方法

但这个方法是异步的
一般情况下,可以在调用时,前面添加 await 关键字;再在方法定义前,添加 async 关键字

可以使用 postman 等工具,模拟发送 json 数据