【问题标题】:node cached export object is broken节点缓存的导出对象已损坏
【发布时间】: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,问题就消失了。我不确定我误解了什么。

标签: node.js require


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多