2013-04-26 64 views
1

我需要一個已經在另一個文件中需要的模塊,但是當我得到該對象時,它的很多鍵都是未定義的。一堆鑰匙在那裏,但有些不是,即使在我調用一些暴露的函數之後。如果我console.log對象,鍵看起來像他們在那裏。節點緩存的導出對象被破壞

例子:

var mod = require('myModule') 
console.log(mod) // { 'aKey':[Function], 'doStoff':[Function] } 
console.log(mod.aKey) // undefined 
mod.doStoff() // calls 'aKey' 
//TypeError: Object #<Object> has no method 'aKey' 
//this error is thrown inside myModule 

這不是太讓我感到吃驚,如果這個模塊是做什麼時,你得到它的加載愚蠢,但該模塊已經爲已經幾件事情在主加載和我已經用它js文件。

我能想到的唯一一件事就是脫離常態:我在主js文件中需要這個模塊(它工作),但它不工作的地方是在一個需要的模塊中主要的。

要clearer->

  • main.js需要Mymodule中
  • main.js需要otherModule
  • otherModule需要Mymodule中

Mymodule中被NPM安裝,但我在node_modules文件夾中原型化其他模塊,直到我將它放置在某處,以便npm將其安裝。

我不明白爲什麼會造成問題;我認爲從require返回的對象被保存在require緩存中 - 就像這樣 - 以便隨後在需要的時候獲得同一個對象。看來我的對象已經被部分刪除了。

這是什麼造成的?我應該做什麼不同?

+1

你確定沒有循環依賴嗎?緩存需要的模塊,但在循環依賴的情況下,節點將首先返回仍在加載的模塊的「未完成的副本」。請參閱http://nodejs.org/api/modules.html#modules_cycles – numbers1311407 2013-04-26 18:02:03

+0

我確信沒有循環依賴關係。我認爲,即使在循環依賴的情況下,如果對象完成一次,它也不會回覆到未完成狀態。 – PagodaJosh 2013-04-26 18:48:50

+0

我會檢查幾件事:1)'otherModule'是否以任何方式修改'myModule'?2)當從不同的模塊需要'myModule'的路徑被解析爲一個不同的字符串時可能嗎? 3)'myModule'在需要時做什麼異步?當然,如果我能看到代碼就會更容易。 – diversario 2013-04-27 22:29:28

回答

0

我發現我爲什麼有這些問題:

當節點嘗試解析路徑require('myModule',它將從當前模塊的位置走下來的目錄路徑。如果在node_modules文件夾中有一個符號鏈接作爲目錄,那麼nodejs將不會沿着該鏈接回到自己的node_modules文件夾 - 它只會沿着目錄路徑尋找您的模塊。我在那裏有一個符號鏈接,可以幫助我將正在開發的模塊放在一個我可以輕鬆測試的地方。我不確定我在什麼時候插入鏈接,但我不認爲這很重要。

由於require沒有解決相同的路徑對我來說,我不斷需要重新加載模塊,而不是require緩存中的一個。

我不知道爲什麼我得到了原本的症狀(某些鍵有時會丟失),但由於我的設置錯誤,我想我發現了一些意外的行爲。