事发原因
最近因公司需求,做一个仓管管理系统,其中产品提了一个功能需求,她要自己在后台可视化控制路由功能,手动添加修改停用某些后台路由功能。考虑到node是启动时,读本地配置文件,路由等配置存在内存中。
问题二
另外还有一个问题,想请教一下各位,路由的权限码,是单纯的写在配置文件中,还是数据库中好一些,考虑到存在数据库中,每次进入路由,路由中间件去查库鉴权,有无这个必要,请问一下常用的路由权限控制,大家怎么做。
测试流程
上午抽空测试了一下,本地读取文件分发路由控制器,通过post请求读取本地路由配置,通过pm2 reload all重启,发现一直在重启中。然后会断开连接,请问这种情况如何解决,或者说有什么思路实现产品提的需求吗。
1. 初始路由
2. 新增路由
3. exec调用pm2 reload all时 pm2 日志信息
4. 代码
5. 本地路由表
6. 这个时候会一直等待响应,这是我本人强行在reload一边的结果
请问有什么解决方式没,或者如何设计可以满足这个需求。
如果没有解决方案,是否需要同产品干架?,这算不算为难我这个小前端。
再次谢谢诸位!
BY:栀九月 、2018/08/18
别沉啊,我不想跟产品干架啊。
概念類似 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的路由源码一看都是正则,头都大了,正则我不会。。。