【发布时间】: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