我有一个函数调用util.endsWith(str, end)
的模型,但我忘记导入我的util文件。通常我会发出如下错误:
cannot call method 'endsWith' of undefined
或类似的东西
但我得到的错误是:
TypeError: Object #<Object> has no method 'endsWith'
表示已定义util
。我做了一个console.log,发现它与require('util')
得到的对象相同。
我当然没有要求使用util模块,我在我的文件中找不到任何地方(不是我希望在另一个文件中需要的东西在这个文件中)。
有趣的是,util
仅在我从其他地方需要此模块时定义;如果我只运行该文件,则util
未定义。
这是正常的吗?
我的文件并不复杂(每行<100行),但我无法用超级基本示例复制它。也许它必须有几个层次。
nodejs 0.10.12
答案 0 :(得分:2)
您很可能忘记在var util
被分配到的其他模块中的某处util
。这会导致创建一个全局变量。
您可能会以这种方式泄露更多全局变量。 您可以通过执行以下操作来概述创建全局变量:
var oldGlobalNames = Object.keys(global)
在主脚本的顶部。然后做
console.log(_.difference(Object.keys(global), oldGlobalNames))
在底部。
这使用Underscore中的difference
函数。
或使用https://github.com/aheckmann/gleak模块。
另一个想法:为util =
执行项目范围的搜索(包括node_modules目录)。了解util
的分配位置。
另见Node.js - why do I get leaks when testing with mocha and zombie?
答案 1 :(得分:0)
我认为这是一个repl vs script解释器的事情。当您运行repl(node
或coffee
)时,确实util
可用作预先导入的模块。但是,当您运行它们并传递脚本参数时,util
不存在:
node -e 'console.log(util)'
[eval]:1
console.log(util)
^
ReferenceError: util is not defined
at [eval]:1:13
at Object.<anonymous> ([eval]-wrapper:6:22)
at Module._compile (module.js:456:26)
at evalScript (node.js:532:25)
at startup (node.js:80:7)
at node.js:901:3
然而,使用repl:
node
> util
{ format: [Function],
deprecate: [Function],
print: [Function],
puts: [Function],......