你真的理解koa/express的路由机制么?
发布于 7 年前 作者 yansong 4288 次浏览 来自 分享

现有route实现

现有的koajs下的route是其实就是middleware。

每一次的route.verb(xxx, fn);其实就相当于挂载了一个koa的中间件。

理解这一点,那么它的问题出来了:

一是搜索路径过长

为什么这么说呢?因为每一次路由都是一次顺序查找的过程。

用过程简单说明就是:

我分别注册了三个路由,A, B, C

然后我这个时候来了个请求是B,

那么,它会先经过A, 然后再到B。

特别是,这个时候来了一个路由D,那么,它的查找路径是: A => B => C 好了,发现没有,进入404处理。

这样一来,如果路由链非常长的话,在最后的路由那么将是一场漫长的查找路径。

二是配置繁琐

每一项你都要写对应的路由配置。

意味着功能有多少,路由就有多少。

三是路由维护困难

随着路由越来越多,如果你不熟悉项目的话,再或者路由写得很乱的话(事实上,这种情况非常容易发生)

你想快速定位一个路由,你还需要一个一个去找。

思考

针对这些,我们能不能做一些优化措施呢?

这也是我在思考的,所以就有了我写的koa-route-tree

核心思想

1. 路径即路由

如果有这么一个请求:GET /app/list

那么这个请求对应的处理函数就应该是:./controllers/app.js中的list函数。

2. 路径也是参数

如果有这么一个请求:GET /app/1

那么,app就是路由,1就是参数

对应的,就会找到controllers/app.js中的index方法,并把1作为第一个参数传入。

直观明了

看到上面,或许你就已经能大概理解我写的这个路由模式。

它的本质就是一个对象树依次向下查找的过程。

这也是我为什么路由名称中有一个tree的原因。

大家明白了么?

好,我再加几句。

关于restful模式

比如:GET /users/20/profile

就相当于调用的/controllers/users.js中的profile方法,并把20作为第一个参数传入。

等价于:/users/profile/20

关于VERB说明

除了GET请求,其他所有的正常请求都应该小写http method + 首字母大写的功能名。

比如:PUT /users/20/profile

就相当于调用了/controllers/users.js中的putProfile方法,并把20作为第一个参数传入。

最后

简单自我介绍一下,目前就职于猿辅导公司,公司前端业务一直用的node.js。koa-route-tree目前一直稳定运行在线上生成环境。

完了。更多信息请移步到:https://github.com/yss/koa-route-tree

5 回复

这种路由模式就是ThinkPHP里边的那种吧,不好意思,然而360的前端7舞团已经产出ThinkJS了

如何体现的解决 搜索路径过长 的问题?

@JustforNode 对象查找。 就想我在文中说的,最后生成的route本质是一棵树(tree) 比如: ···js let controller = { api: { lessons: lessonFn } }

这个时候来了个请求:GET /api/lessons
那么它就会依次向下找到controller.api.lessons

koa竟然是这样搞的。。。

回到顶部