组织路由而不预先加载nodejs中的模块

时间:2013-02-28 08:22:52

标签: node.js express

目前,Express框架中的路由需要先加载模块。但是,在有数百个模块的现实生活场景中,这将不会有效。我想只加载所需的模块。有没有一种方法可以在不预先加载模块的情况下定义到目标模块的路径。

像这样的东西

app.get('user / showall','user.list');

所以我希望只有在特定请求需要加载时才加载用户模块。

2 个答案:

答案 0 :(得分:1)

由于模块必须在运行时加载,我宁愿使用快速请求处理而不是使用慢速请求处理的快速启动。

但如果你真的想要,你可以创建一个中间件来实现这种行为(完全未经测试):

 var lazyload = function(route) {

   var s = route.split('.');
   var mod = s[0];
   var exp = s[1];

   return function(req, res, next) {
     require(mod)[exp](req, res);
   };
 };
 ...
 app.get('user/showall', lazyload('user.list'));

(这假设路由始终命名为MODULENAME.EXPORTEDNAME)。

答案 1 :(得分:0)

我的第二点是@robertklep所说的“我宁愿使用快速请求处理的慢启动而不是使用慢速请求处理的快速启动”。

但我强烈建议不要执行require来处理请求,因为第一个调用是同步的并且会阻塞服务器,这不仅会影响当前请求,还会阻止处理任何其他请求。有足够的此类请求,您的服务器将停止回复请求。

基本上:预加载您需要的所有代码,但是延迟加载数据(以异步方式)。

(这不是你要求的,但这被认为是不好的做法)。