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 文件中需要这个模块(并且它可以工作),但它不起作用的地方是在 main.js 文件中需要的模块内。

为了更清楚->

  • main.js 需要 myModule
  • main.js 需要 otherModule
  • otherModule 需要 myModule

myModule 是由 npm 安装的,但我在 node_modules 文件夹中对 otherModule 进行原型设计,直到我把它放在某个地方以便 npm 安装它。

我不明白为什么这会导致问题;我认为从 require 返回的对象被保存在 require 缓存中 - 原样 - 这样当它被需要时,你会得到相同的对象。看来我的对象已被部分删除或什么的。

这是什么原因造成的?我应该怎么做?

4

1 回答 1

0

我找到了我遇到这些问题的原因:

当节点试图解析路径时,它会从当前模块的位置require('myModule'沿着目录路径向下走。如果您在 node_modules 文件夹中有一个符号链接作为目录,nodejs 将不会跟随该链接回到您自己的 node_modules 文件夹 - 它只会沿着目录路径查找您的模块。我在那里有一个符号链接,可以帮助我将正在开发的模块保存在我可以轻松测试它们的地方。我不确定我在什么时候添加了那个链接,但我认为这并不重要。

由于require没有为我解析到相同的路径,我不断获得模块的新负载,而不是 require 缓存中的模块。

我不确定为什么会出现最初的症状(有时某些键会丢失),但是由于我的设置损坏,我想我发现了一些意外行为。

于 2013-05-01T21:52:46.353 回答