Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

你真的理解koa/express的路由机制么?

$
0
0

现有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函数。

  1. 路径也是参数

如果有这么一个请求: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


Viewing all articles
Browse latest Browse all 14821

Trending Articles