【问题标题】:Node Module Caching节点模块缓存
【发布时间】:2015-08-20 01:00:33
【问题描述】:

我正在使用 express 创建应用程序,但在使用 module.exports 时遇到了问题。我有一条路线可以处理签出用户并根据他们的订单创建 pdf。为了保持模块化,我一直将路由功能分成模块,并在必要时需要它们,例如:

Route1.js

module.exports = function(req, res){
   // route functionality
};

routes/index.js

Route1 = require('./Route1');
router.post('/api/v1/route1', Route1);

这对于保持井井有条非常有效,但是我创建了一个包含许多复杂功能的路由,而且缓存似乎存在问题。我第一次调用该路由时它工作正常,但第二次调用它时它卡在无限循环中,因为最后一个请求中的一个变量是持续存在的,它永远不会跳出循环,因为它大于循环退出所需的数字。我什至重置了通过 module.exports 传递的函数开头的所有变量。

为了解决这个问题,我不再导出路由功能,而是直接将其传递给路由。这是一个例子:

每次都有效

router.post('/api/v1/dostuff', function(req, res){
    var count = 0;

    var doSomething = function(){
       // if count === something else break
       // else add one to count and run this function again
    }
});

第一次工作

do_something.js

module.exports = function(req, res){
    var count = 0;

    var doSomething = function(){
       // if count === something else then break out and do something else
       // else add one to count and run this function again

       // This works the first time but the second time 
       // count is persisting and it is already greater than 
       // the number I am checking against so it 
       // never breaks out of this function
    }
};

routes/index.js

var doSomething = require('./do_something.js');

// Only works as expected the first time the call is made
router.post('api/v1/dosomething', doSomething);

那么为什么在使用 module.exports 时,我的函数只能按预期工作一次?我在想这与节点模块缓存有关。

【问题讨论】:

  • 如果代码完全相同并且没有对module 文件中的module 对象执行任何其他操作,则应该没有问题。唯一可能存在的问题是,如果您正在编辑 doSomething 变量,而您在 routes/index.js 中需要该变量。对于一些调试想法,请查看this answer 以及该问题中的其他一些想法。
  • @cdbajorin 我也是这么想的,但是当它是完全相同的代码时,确实会发生一些事情。
  • 我唯一能想到的另一件事是递归可能存在问题(我假设基于有限描述的递归)?也许您可以尝试将其切换为while循环。同样,这不应该是一个问题,但这是另一个需要遵循的调试路径。

标签: javascript node.js express


【解决方案1】:

我不太确定模块缓存,但我的应用中有一些功能与您的非常相似。所以我希望你尝试这样的导出模块

something.controller.js

exports.doSomething = function(req, res){
  // your code
}

和 index.js

var controller = require('./something.controller.js');

router.post('/api/v1/dosomething', controller.doSomething);

希望有帮助

【讨论】:

  • 我认为这会给我同样的结果,虽然我可以在有时间的时候尝试。我之前尝试过一种面向对象的方法,例如 module.exports = { ... init: function()... }。这与做exports.init = function(); 相同。我得到了同样的结果。变量持续存在,没有被重置。
猜你喜欢
  • 2023-01-23
  • 2015-10-24
  • 2019-02-14
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多