2013-07-09 55 views
1

我有一個功能調用util.endsWith(str, end)模型,但我忘了導入我的util文件。通常我會希望像一個錯誤:nodejs'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

+3

很多可以去錯〜100行CoffeeScript的 – naomik

回答

2

很可能是忘在不同的模塊,其中util被分配到什麼地方做var util。這會導致創建一個全局變量。

您可能會以這種方式泄漏更多全局變量。 你可以得到它正在做創建全局的概述:在主腳本的頂部

var oldGlobalNames = Object.keys(global) 

。然後做

console.log(_.difference(Object.keys(global), oldGlobalNames)) 

底部。

這使用Underscoredifference功能。

或使用https://github.com/aheckmann/gleak模塊。

另一個想法:做一個項目範圍的搜索(包括node_modules目錄)util =。瞭解util正在分配到哪裏。

參見Node.js - why do I get leaks when testing with mocha and zombie?

+0

,因爲我瞭解它,這不是節點模塊的工作方式。在任何情況下,這個JavaScript是由coffeescript生成的,所以它是不可能'忘記'把'var' – PagodaJosh

+0

我認爲你說的是​​正確的瀏覽器,但我不在瀏覽器中。 – PagodaJosh

+0

寶塔是正確的。所有節點模塊都在包裝函數中執行,因此用'var'聲明的變量在模塊的包裝函數範圍內,因此對其他模塊不可見。 –

0

我認爲這是一個REPL VS腳本解釋器的東西。當您運行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],...... 
+0

是的,我注意到所有的常規模塊在節點REPL中都是全局的,但是我用'node myfile.js'啓動我的代碼,所以我不認爲它是。 – PagodaJosh

+0

那麼,POST。你的。碼。 –

+0

@PagodaJosh我以爲你說你正在使用咖啡標記?那麼爲什麼不'coffee myfile.coffee'? – naomik

相關問題