我的 Node 代码中有一个 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;
在运行时检查 Node 调试器时,需要的结果是:
Closure:
Error110: function Error110(params)
Error131: function Error131(params)
Error132: undefined
Error133: undefined
Error150: function Error150(messageObject, callback)
error132和Error133在require后不可用,其他完美。
我读到如果你有一个 require 循环就会发生这种情况,因此一个必需的模块 (A) 需要一个模块 (B),而模块 (B) 又需要模块 A。Node 然后通过返回 undefined
来结束这个循环。在第一次要求之后。事实并非如此。
所以我最后的猜测是,在执行时,由于 Node 的异步性质,文件“还”不是必需的,因此只包含“一些”文件。但是 require 是一个同步函数。我不确定这种情况是否可能以及我将如何检查它。
我在这里一无所知,非常感谢帮助。
最好的问候, 世界
编辑 1:
正如 Travis Webb 所指出的:这是错误的!
如果您需要一个已经包含在代码前面某处的模块,也会发生这种情况。我考虑过这个,但我不需要模块。总而言之,这似乎不是真的,因为,例如,util
模块需要包含在它使用的每个文件中,而不是只包含一次。
最佳答案
一个更简单的解释是 module.exports
在您需要的模块内解析为 undefined
。发布失败模块的代码。
It also happens if your require a module that is already included somewhere earlier in the code.
这个说法是不正确的。
due to the asynchronous nature of node, the files are "not yet" required
require
是同步的。
如果模块 A
需要 B
是正确的,而 B
又需要 A
,那么 A
将在模块 B
中为 undefined
。但我不确定这是问题所在。
关于javascript - Node 要求返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063868/