nodejs'util'有时候是全局的吗?

时间:2013-07-09 16:04:45

标签: node.js

我有一个函数调用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

2 个答案:

答案 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(nodecoffee)时,确实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],......