关于express框架怎么进行动态(不重启node)的url添加和删除呢
发布于 8 年前 作者 fengheGitHub 6311 次浏览 来自 问答

大家好; 我使用express框架有几条路由, app.use(’/aaa’, aaa); app.use(’/bbb’, bbb); app.use(’/ccc’, ccc); app.use(’/’, default);

我想在不重启nodejs的前提下,如何将添加在内存中的aaa删除,再加一条路由ddd呢。
网上找了好几天也未有答案,求高手指点,多谢
16 回复

不重启内存的代码不会更新的,这个不行,除非你把路由做成可配置的,fs.watch检查配置文件的改变,或者定时刷新配置文件到redis,这个的影响不如重新启动

supervisor ,不知道是不是你想要的

热加载?

@dlutwuwei 定时进行require指定目录下的文件可以动态的增加,能够加载到内存运行的,但是进行删除貌似真难搞定,因为现在想的是delete require,但还没尝试的。

@luoyjx 嗯,热加载

@Chensonghao 这个功能蛮有用的,但这个是重启node进程的,我想做的是不重启进行功能的增加,不过谢了

@fengheGitHub 加在路由里,或者stdin。 重挂路由需要一个复写的js,我项目代码表示下。

var load = function(path){
    if(require.resolve(path)){
        delete require.cache[require.resolve(path)];
        require(path);
    }
};

路由还是比较好解释的

//删除某链路
app.use('/remove',function(req,res){
	app.use(req.body.route,null);
	res.end();
})

//从文件更新链路path是你需要更新的文件
//跟你写法也有关系,可能需要把更新过的文件在所有用到的地方重load。
app.use('/update',function(req,res){
	load(req.body.path);
	res.end();
})

//express在框架层上对热重载的支持就不是很好。

热重载的最好使用环境是全局 global作为总集的项目。这样load可以直接作用于全局。

var dynamicRoute = {};

function addRoute(url, handler) {
  dynamicRoute[url] = handler;
}
function removeRoute(url) {
  delete dynamicRoute[url];
}

app.use(function(req, res, next) {
  if (dynamicRoute.hasOwnProperty(req.url)) {
    return dynamicRoute[req.url](req, res, next);
  }
  return next();
})

@MiguelValentine 多谢热心大侠,我试试,可以的话我会把详细实现分享给大家的。不过话说,require好黑盒,很多方法操作没有找到具体介绍

@MiguelValentine 试过了加载可以,但删除不可以: var aaa app.get(’/v3/loadaaa’, function(req,res){ aaa = require(’./aaa/routes/index’); //app.use(’/v3’, null); – 报错[2015-12-08 14:48:05.200] [ERROR] console - TypeError: Router.use() requires middleware function but got a Null app.use(’/v3/aaa’, aaa); res.write(‘Load aaa’); res.end(); }); app.use(’/v3’, default);

但我想了个方法,就是在default中去判断是否申请的路由能够匹配到/v3/aaa(新增的url存入数组中),如果可以走next();

目前还是没有好方法来删除路由。。。。

@fengheGitHub 好好看看module.js里的源码

@fengheGitHub 好吧。。我很久以前看的源码,忘了他是注册在layer还是在哪里的。 自己看下源码 lib/route 那一块

@luoyjx 看了半天代码和express API,貌似么有啊,请问有吗,具体是如何的

@fengheGitHub 我是指你说的require好黑盒

@MiguelValentine 哈哈,我想到方法了,不改express源码的情况下进行删除,express应该没有提供这个删除功能

@fengheGitHub 什么方法,我也想知道呢

回到顶部