模块导出不工作

新手上路,请多包涵

我正在创建一个爬虫来解析游戏我在主文件(crawler.js)上有这个功能

function kicked() {
    try {
        info.logged = false;
        info.next_login = 0;
        info.login_tries = 0;
        report('Crawler disconnected from game, reconnecting.');
    }
    catch (error) {
        report('Disconected() error => ' + error);
    }
}

我有

module.exports = { kicked: kicked };

在另一个文件(更新会话)中我有

var crawler = require('../../crawler');

但是当我调用 crawler.kicked() 我得到未定义,如果我使用 console.log(crawler); 它显示一个空对象没有任何错误,只是一个空对象,我找不到为什么文件是’导出功能有什么帮助吗?

原文由 user2942910 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 227
2 个回答

问题是你有循环依赖,当 A 需要 B 时会发生这种情况,B 需要 A,等等。这些并不总是问题。 Node 可以处理循环依赖。但是,如果对 Node 模块的解析方式没有很好的理解,您很可能会遇到问题(通常是空对象问题)。

让我们仔细看看这里发生了什么:

  1. 您启动主脚本 ( crawler.js ),它开始执行。
  2. crawler.js 需要 session.js
  3. 现在 session.js 开始执行它的顶层代码。请记住 crawler.js 还没有执行完它自己的顶级代码。
  4. 现在 session.js 需要 crawler.js 。但是 crawler.js 没有任何东西可以导出(还)。它还没有到达文件的底部(它仍然在顶部执行它的 require 调用)。

所以现在我们可以看到发生了什么。空对象是默认的导出对象。当您执行 module.exports = {...} 时,您将模块的 exports 属性重新分配给一个新对象。但是 module.exports 由于上述原因尚未重新分配。

解决方案将是重新考虑您的代码。我建议尝试完全消除循环依赖;一旦您更好地掌握了它们的工作原理,您可能希望不时使用它们。您的主文件应该没有任何导出。尝试将你的 kicked 函数放在另一个文件中,并在需要的地方要求它。

原文由 McMath 发布,翻译遵循 CC BY-SA 4.0 许可协议

也可以直接将函数作为 module.exports 的属性赋值,如下:

 module.exports.kicked = () => ...

虽然这可行,但您需要在每次调用该函数时指定 module.exports.kicked() ,这对于内部文件使用来说可能会很烦人。但不是一个糟糕的快速修复解决方案

原文由 Julian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏