【问题标题】:Node require returns undefined节点要求返回未定义
【发布时间】:2014-09-23 16:35:35
【问题描述】:

我的节点代码中有一个 ErrorHandler 类来处理所有发生的错误。

每个错误都有自己的类。所有类都放在单独的文件中,因此文件夹结构为:

  • ErrorHandler.js
    • Error110.js
    • Error131.js
    • ...

ErrorHandler 需要这些文件中的每一个(以及其他一些文件)

var serverErrorCodes        = require('../../config/ErrorCodesConfig').server,
clientErrorCodes            = require('../../config/ErrorCodesConfig').client,
Error110                    = require('./errors/Error110').Error110,
Error131                    = require('./errors/Error131').Error131,
Error132                    = require('./errors/Error132').Error132,
Error133                    = require('./errors/Error133').Error133,
Error150                    = require('./errors/Error150').Error150;

在运行时检入节点调试器时,需要的结果是:

Closure:
  Error110: function Error110(params)
  Error131: function Error131(params)
  Error132: undefined
  Error133: undefined
  Error150: function Error150(messageObject, callback)

在require之后Error132和Error133都不可用,而其他的则完美。

我已经读到,如果您有一个 require 循环,就会发生这种情况,因此所需的模块 (A) 需要一个再次需要模块 A 的模块 (B)。然后节点通过在第一个之后返回 undefined 来结束这个循环要求。事实并非如此。

所以我最后的猜测是,在执行时,由于节点的异步特性,文件“尚不”需要,因此只包含“一些”文件。但是 require 是一个同步函数。我不确定这种情况是否可行以及如何检查。

我在这里一无所知,非常感谢您的帮助。

最好的问候, 沃普

编辑 1:
正如 Travis Webb 指出的那样:这是错误的!
如果您需要一个已经包含在代码中较早位置的模块,也会发生这种情况。我想过这个,但我不需要模块。总而言之,这似乎并不正确,因为例如,util 模块需要包含在它使用的每个文件中,而不仅仅是一次。

【问题讨论】:

  • 你确定里面的文件是正确的吗? console.log(require('./errors/Error132')) 显示什么? Error132和Error133文件的内容是什么?
  • 感谢您的快速回复!我很确定他的内容是正确的。至少我已经尝试将工作文件的内容复制/粘贴到失败的文件中(通过查找/替换更改类名,注意被替换的内容)并试图以相同的结果要求它。由于我目前正在旅行并且无法访问代码,因此我会在回来后尽快发布失败的文件。
  • 所以!有一阵子了。对于那个很抱歉。事实证明,你是对的。我的一位同事提交了一个补丁,该补丁更改了每个文件中的一个数字,将 Error133 的导出变为“Error132”,将 Error133 中的导出变为“Error132”。对于这个愚蠢的错误,我感到非常抱歉,我只是没有发现它...您可以将您的评论作为答案,以便我将其标记为正确吗?
  • 那么你想将我的答案标记为正确吗?
  • Hey Travis =) 我觉得你的帖子最终对于其中包含的整体信息来说是更重要的。不过,这不是这个问题的答案,因为杰西的回答实际上让我弄清楚了。我觉得您在下面的回答将继续受到应有的关注和支持=)

标签: javascript node.js undefined require


【解决方案1】:

一个更简单的解释是module.exports 在您需要的模块内解析为undefined。贴出失败模块的代码。

如果您需要一个已经包含在代码前面某处的模块,也会发生这种情况。

这个说法不正确。

由于节点的异步特性,文件“尚未”需要

require 是同步的。

正确的是,如果模块A 需要B,而后者又需要A,那么A 在模块B 中将是undefined。但我不确定这是不是问题。

【讨论】:

  • 感谢您的澄清。我将对其进行编辑。由于接下来的几天我都在路上,所以我会在回家后尽快发布失败文件的代码。
  • 嘿特拉维斯,正如你从我上面的评论中看到的那样,我很愚蠢,忽略了我同事带来的打字错误。不过你的观点非常重要,除了我已经在我的原件中编辑了它邮政。由于我还没有足够的声望给分数,我可以做些什么来将您的答案标记为重要?
  • 继续使用 Stackoverflow :) 我很有耐心。
  • 仍然,非常感谢!我会记住你的评论。在我可以投票之前只有 5 个声誉:D
  • 现在怎么样? :)
【解决方案2】:

你确定里面的文件是正确的吗? console.log(require('./errors/Error132')) 显示什么? Error132和Error133文件的内容是什么?

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2015-04-03
    • 2020-06-01
    • 2019-03-13
    • 2017-03-08
    相关资源
    最近更新 更多