【发布时间】:2013-04-26 17:39:58
【问题描述】:
我需要另一个文件中已经需要的模块,但是当我获取对象时,它的许多键都未定义。一堆键在那里,但有些不是,即使在我调用了一些暴露的函数之后。如果我 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 文件中需要这个模块(并且它可以工作),但它不工作的地方是在主要的。
为了更清楚->
- main.js 需要 myModule
- main.js 需要 otherModule
- otherModule 需要 myModule
myModule 是由 npm 安装的,但我在 node_modules 文件夹中对 otherModule 进行原型设计,直到我把它放在某个地方以便 npm 安装它。
我不明白为什么这会导致问题;我认为从 require 返回的对象会保存在 require 缓存中——原样——这样当它被需要时,你会得到同一个对象。看来我的对象已被部分删除或什么的。
这是什么原因造成的?我应该怎么做?
【问题讨论】:
-
你确定没有循环依赖吗?
require'd 模块被缓存,但在循环依赖的情况下,节点将首先返回仍在加载的模块的“未完成副本”。见nodejs.org/api/modules.html#modules_cycles -
我确定没有循环依赖。我认为,即使在循环依赖的情况下,如果对象完成一次,它也不会恢复为未完成。
-
我要检查的几件事:1)
otherModule是否以任何方式修改了myModule? 2) 当required 来自不同的模块时,myModule的路径是否可能被解析为不同的字符串? 3)myModule是否在需要时做任何异步操作?当然,如果我能看到代码就更容易了。 -
我确信
myModule不会改变。你可以看到我需要的模块here。 github上的代码有很多qc.whatever = function(){..};exports.whatever = qc.whatever,如果我只设置qc = exports,问题就消失了。我不确定我误解了什么。