还是不够简洁

前一章的例子中,虽然把通用操作,写在了面包里,但是!

写了好几次 breadList 和 path

而往往同一模块内,这些东西都是一样的

也就是说,应该有某种方式,来避免这种重复的代码

使用 router.HandlerReaper

基本操作

借助 router.HandlerReaper,之前的代码可以改写为

  1. const { server, router } = require('kuaizi')
  2. const reap = new router.HandlerReaper({
  3. path: '/user',
  4. breadList: [checkLogin, checkAdmin]
  5. })
  6. reap({
  7. handler(ctx){
  8. let param = ctx.getParam()
  9. return `你想获取 id 为 ${ param.id } 的用户的信息`
  10. }
  11. })
  12. reap({
  13. method: 'post',
  14. async handler(ctx){
  15. let data = await ctx.getJson()
  16. return {
  17. msg: '你似乎上传了一个用户的数据',
  18. data: data
  19. }
  20. }
  21. })
  22. reap({
  23. method: 'delete',
  24. breadList: [checkAAAdmin],
  25. handler(ctx){
  26. let param = ctx.getParam()
  27. return `你想删除 id 为 ${ param.id } 的用户的信息`
  28. }
  29. })
  30. server.start(8888)

第四、五行的 path 和 breadList 会被应用到下面的每一个 handler

这样,当用户模块的路径变化时(比如从 /user 变成 /u)、模块的权限变化时,就不用改每一个 handler

追加 breadList

上面的代码中,除了查询和上传用户,还有一个“删除用户”的 handler

因为删除用户往往是危险的操作,因此需要更高的安全保障

第 28 行,声明了此 handler 需要 checkAAAdmin,也就是说

删除用户时,不仅要执行在 HandlerReaper 里声明的 checkLogin 和 checkAdmin

还要执行 checkAAAdmin

追加 path

跟“追加 breadList”一样

在 handler 里声明的 path,会和 HandlerReaper 里声明的 path 接在一起

比如,new HandlerReaper 里的 path 是 /aaareap 里的 path 是 /bbb

则添加的 handler 的 path 是 /aaa/bbb

使用场景

同一模块的接口,往往写在一起更好一点

因为它们需要类似的权限控制、几乎相同的 path

内聚性 +1~