节点缓存导出对象已损坏

时间:2013-04-26 17:39:59

标签: node.js require

我需要一个已经在另一个文件中需要的模块,但是当我得到该对象时,它的许多键是未定义的。有一堆键在那里,但有些不是,即使在我调用一些暴露的函数之后。如果我在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文件中需要这个模块(并且它可以工作),但它不起作用的地方是在一个模块中需要的主要。

更清楚 - &gt;

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

myModule是由npm安装的,但是我正在对node_modules文件夹中的其他模块进行原型设计,直到我把它放到某处,所以npm会安装它。

我不明白为什么这会导致问题;我认为从require返回的对象被保存在require缓存中 - 原样 - 所以当它需要时,你会得到同一个对象。似乎我的对象已被部分删除或其他东西。

造成这种情况的原因是什么?我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

由于require没有为我解析相同的路径,因此我不断加载模块,而不是需要缓存中的模块。

我不知道为什么我得到了我原来的症状(某些键有时会丢失),但由于我的设置有问题,我猜我发现了一些意想不到的行为。