怎么实现动态路由?
发布于 8 年前 作者 dmwin72015 10790 次浏览 来自 问答

刚开始学习,node,express。用到路由器这块。刚开始直接写在routes下,但是后发现,每次要增加一个新的请求,就会修改对应的路由文件下,增加一个get,或者post方法,感觉非常不方便。后来发现有的项目,不需要这么麻烦,比如:有一个controller目录下,放的是所有的路由,每个文件名对应的就是相应的请求路径,每个请求执行的是controller下对应名字的这个文件。而且这样每次增加新的路由,只需要在controller下增加一个文件就可以了,其他地方都不用修改。 那么问题来了: 这个是怎么实现的,给一个思路了,我已开始想的是,读取目录下的所有文件,获取所有文件的path,然后在require(path)。不知道这样可不可以?

13 回复

你的思路是对的,但应该不用读取所有的controller文件的path,而且根椐请求参数来判断当前请求所需require的controller文件 switch(ctx.path){ //根椐不同的请求方法和path, require指定目录下的不同文件进行相应的业务逻辑处理 }

同意 tim1020 的说法,另外补充几点:

  • 对于相似规则的uri,可以通过参数的形式,在一个action中捕捉然后分流,不一定通过路由的机制实现。比如 koa-router,中的参数的使用。
  • 动态加载路由可能会额外的暴露一些私有的方法,这点在实现动态路由时候要注意
  • 路由文件的配置虽然看似罗嗦,但却在规则中很好的描述了网站或者服务的功能入口,便于项目的维护。

上面说的都挺好的,尤其是@douguohui 谢谢

感谢大家帮助!

@tim1020 我开始的思路也是这样的,但如果是,根据请求参数去判断,然后在require所需的文件,岂不是在速度方面比一次性require所有的文件要慢,毕竟require所有文件之后,不会在涉及到文件读取IO操作了

最近尝试实现了一个KOA2的路由中间件,不但可以实现自动路由,还可以实现自动RESTful服务,有兴趣的可以看看

https://github.com/tim1020/ec-router


提供规则路由功能,不再需要复杂无趣的路由文件,路由影射表等。

支持的路由规则包括:

RESTful方式,例如:GET /res, PUT /user/12 PATH方式,  例如:  GET /res/list, POST /res/add QueryString方式,例如 GET /apiName?c=res&a=list, POST /apiName?c=user&a=add

三种方式均可实现自动的查找controller文件并执行其中的对应的方法。(如果无法匹配,则响应404)

同时提供无代码自动实现RESTful服务的功能,只需要创建好相应的数据库表,并在koa中引入该中间件,即可提供基本的RESTful服务接口,包括常规则的增删改查功能,无需编写业务代码。

你用koa,koa就是你说的那种,

来自酷炫的 CNodeMD

设置一个生成路由的js,然后传参,参数代表路由名字,get或post,还有需要存放的路径,然后生成

@tim1020 目前我们的项目就用的这种方法。但是同时也用到了eval函数。

现在的孩子做开发已经不屑于读文档了吗?

回到顶部