express不重启进程,热更新路由。
发布于 6 年前 作者 zhang962976642 3960 次浏览 来自 问答

事发原因

最近因公司需求,做一个仓管管理系统,其中产品提了一个功能需求,她要自己在后台可视化控制路由功能,手动添加修改停用某些后台路由功能。考虑到node是启动时,读本地配置文件,路由等配置存在内存中

问题二

另外还有一个问题,想请教一下各位,路由的权限码,是单纯的写在配置文件中,还是数据库中好一些,考虑到存在数据库中,每次进入路由,路由中间件去查库鉴权,有无这个必要,请问一下常用的路由权限控制,大家怎么做。

测试流程

上午抽空测试了一下,本地读取文件分发路由控制器,通过post请求读取本地路由配置,通过pm2 reload all重启,发现一直在重启中。然后会断开连接,请问这种情况如何解决,或者说有什么思路实现产品提的需求吗。

1. 初始路由
1.png
2. 新增路由
2.png
3. exec调用pm2 reload all时 pm2 日志信息
3.png
4. 代码
6.png
5. 本地路由表
4.png
6. 这个时候会一直等待响应,这是我本人强行在reload一边的结果
5.png

请问有什么解决方式没,或者如何设计可以满足这个需求。
如果没有解决方案,是否需要同产品干架?,这算不算为难我这个小前端。 再次谢谢诸位!

BY:栀九月 、2018/08/18

20 回复

别沉啊,我不想跟产品干架啊。

概念類似 variable as function name

controllers = require('jobs');
let name = doc.controller;
await controllers[name](req, res, next);

建議存於db方便做開關控制

老實說這種方式是不對的,pipeline的概念被顛覆了。 應該考慮使用兩個程式,nginx做proxy導向到不同程式的port 讓a控制b,reload就應該沒問題。 如果是這樣作,配置文件是檔案或db都沒差,看你習慣。

@worl2160 不好意思,昨天休息,没看到您的回复,- -,还是不太懂您说的意思。

她要自己在后台可视化控制路由功能,手动添加修改停用某些后台路由功能。

她手动添加路由,那该路由对应的功能应该是是现成写好的吧。把权限和路由表存到数据库里,页面路由动态获取,访问权限动态判断。

@jamiesoung 我这边写好控制器代码,上传到服务器,她(ps: 产品自己在后台指定那个路由,指定那个控制器),然后我想问的是,node不是在我初始化的时候只执行一次路由注册吗,当我新增或者更新时,node怎么知道我更新了路由。

看需求的意思是造个权限系统呀

@wangchaoduo 可怜,刚产品问我规划的怎么样了,何时动工,我这边不重启进程,增改路由,一点头绪都没有。怕是要被打了。。。

既然都是any, 干嘛要用ts, 无语

@zhang962976642 我意思是改寫成兩個部分,一個部分管理另一部分使用 app for use => port 3000 app for manage => port 3100 nginx

{
    localtion / {
	    proxy_pass 127.0.0.1:3000
	}
	location /manage {
	    proxy_pass 127.0.0.1:3100
    }
}

而後重啟 app for use 的部分就不會因為 exec 執行 kill 產生奇怪的問題 當然是麻煩了點…但是勝在可行性高

@worl2160 您的意思是,nginx做个负载均衡,配两套,A抽离成需要reload的业务,B抽离成不需要重启的业务,那么这样划分业务,具体以什么条件去划分,看需不需要重启吗。

@worl2160 谢谢大佬,提供的思路,我大概整的了解一些了,B的业务正常些,A业务当成拓展的。共用一个数据库,当B新增时,relaod A业务,A重启,不影响B,由于是nginx,这样配置好A和B的路由,不冲突,这样看起来,也像是一个网站,一个业务是吧。

@zhang962976642 举个例子说吧。 比如你这是仓库管理系统,比如管理员新增了一个仓库(id为003),那么这个仓库对应一个新url:xxx.xxx.xx/warehouse/003, 那么你后端的路由应该是/warehouse/:id,不存在路由更新的问题。

管理员不可能凭空创建一个页面,而没有对应的后台逻辑。

@zhang962976642 沒錯,我想出錯地方可能是執行pm2 restart時,你同等在kill自己


在你原本的想法上出發來看,只要你能在runtime中拿到app的instance及初始化route的執行stack也不是不能做… 但這樣違背node的本意,所以我覺得應該是沒有方便的方式來實現這種功能

告诉你一个骚操作, require.cache 当然,最好配合负载均衡,不然有惊喜

@worl2160 嗯,是的,您说的这种方式,适合部署,单独的插拔那块都方便一些。中大型项目这么确实合理,谢谢大佬。

@jamiesoung 您这是动态路由,和我说需求还是不一样,不过还是谢谢回答,楼上大佬给出了解决思路。

根本不需要 express路由, 自己写逻辑 根据url判断就 可以了, 自己写的逻辑里不管读配置读内存还是数据库随意。

@xcstream 不懂路由怎么实现- -,express的路由源码一看都是正则,头都大了,正则我不会。。。

回到顶部