【问题标题】:Organizing routes without pre loading the modules in nodejs express无需在 nodejs express 中预加载模块即可组织路由
【发布时间】:2013-02-28 08:22:51
【问题描述】:

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

类似的东西

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

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

【问题讨论】:

    标签: node.js express


    【解决方案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)。

    【讨论】:

    • 我还希望通过快速请求处理来实现慢速启动。我不太确定 nodejs 中模块缓存的范围(模块是跨单个 http 请求中的多个调用还是跨多个 http 请求进行缓存),但我得到了答案。鉴于加载后的模块可用于所有后续调用,我的部分问题得到了回答。
    【解决方案2】:

    我赞同@robertklep 所说的“我宁愿启动缓慢但请求处理速度快,而不是快速启动但请求处理速度慢”。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2022-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2018-11-08
      • 2020-04-28
      • 2020-09-18
      相关资源
      最近更新 更多