模块导出不起作用

use*_*910 3 javascript node.js

我正在创建一个爬虫来解析我在主文件上有这个功能的游戏(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有

module.exports = { kicked: kicked };
Run Code Online (Sandbox Code Playgroud)

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

var crawler = require('../../crawler');
Run Code Online (Sandbox Code Playgroud)

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

McM*_*ath 10

问题是你有循环依赖,这是当A需要B时发生的,它需要A等.这些并不总是一个问题.节点可以处理循环依赖.但是,如果没有很好地理解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函数放在另一个文件中,并在需要的地方要求.