请教nodejs中怎么动态修改服务器配置
发布于 10 年前 作者 haozxuan 8469 次浏览 最后一次编辑是 8 年前 来自 问答

如题:现有一个需求是,在服务器不重启的情况下,更新配置文件内容,并且服务器使用更新后的配置参数。 举个栗子: untitled1.png 模拟一个服务器进程,该服务器进程的任务是循环打印出配置文件message中的message字段,现在突然修改message字段,想让其作用到服务进程中,在不重启的情况下,怎么做到?

17 回复

@sjfkai 额,这个有点跑偏了,你做的工作是监控文件变动,重启服务。我是用pm2 watch也可以做到,不过我想做到的是不重启服务的情况下,更新配置文件。

监控stdin 接受一个update的信号。自动重新require ==>如果监听了log或者打印很多的话,不知道有没有冲突

不要问太多问题,在控制台直接输入update回车即可

var readable = process.stdin;
readable.on('data', function(chunk) {
    var common = (chunk.toString()).substr(0,(chunk.toString()).length-1);
	if(common=='update'){
		delete require.cache[require.resolve('./message')];
		Message = require('./message');
	}
});

@MiguelValentine 重新require 没有效果的,require过一次后,以后require都是从cache中取

@MiguelValentine 窝一般给那个模块价格update的方法,call一下就是了,不用重新require

@captainblue2013 有具体实例吗?贴出来学习下。

@MiguelValentine 删除缓存做法应该是最简单的了。我目前使用的是 untitled3.png 这种应该是比较low的。

另外想请教下,针对于同一份js文件,多个服务进程调用他,想对这个js更新配置参数,除了每个服务器进程都进行一次update操作外,还有其他好的办法吗?

@jerrywu55 正常情况下的确require多次和一次效果是一样的,但如果delete require.cache[require.resolve(’./message’)];这样的话就可以将单个模块从缓存中删除。

@hezedu 恩,看了下。目前仅仅是想做配置参数的动态变更,应该还用不到那么多。

其实“配置”的 意思就是 一次运行不会随意变动的部分。

@chita 或许我描述的不是很清楚,你可以理解为我在做一个游戏的掉宝概率,如果策划想开活动我就需要动态的更改,这里并不是指数据库等硬性的参数配置,所以在不重启服务的情况下更新还是很有必要的。

@i5ting 恩,看了下,需求实现还不错,只是感觉不太合适。逻辑简单的情况下还是避免引入过多而第三方包的好。

回到顶部