我正在创建一个爬虫来解析我在主文件上有这个功能的游戏(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);
它显示一个空对象没有任何错误,只是一个空对象,我无法找到为什么该文件不是导出函数任何帮助?
答案 0 :(得分:8)
问题在于你有循环依赖关系,当A需要B时需要A,等等。这些并不总是一个问题。 Node can handle cyclic dependencies。但是,如果没有很好地理解Node模块的解析方式,您可能会遇到问题(通常是空对象问题)。
让我们仔细看看这里发生了什么:
crawler.js
),开始执行。crawler.js
需要session.js
。session.js
开始执行其同步操作。请记住,crawler.js
尚未完成其同步操作。session.js
需要crawler.js
。但crawler.js
无法导出(尚未)。它还没有到达文件的底部(它仍然在顶部执行其require调用)。所以现在我们可以看到发生了什么。空对象是默认的导出对象。执行module.exports = {...}
后,您将模块的exports
属性重新分配给新对象。但由于上述原因,module.exports
尚未重新分配。
解决方案是重新考虑您的代码。我建议尝试完全消除循环依赖;一旦你更好地掌握了它们的工作原理,你可能会不时地使用它们。你的主文件应该没有任何导出。尝试将kicked
函数放在另一个文件中,并在需要时进行处理。
答案 1 :(得分:1)
将.js
添加到crawler
中require
字词的末尾。您需要指定文件,而不是名称。
有一篇好文章here。有点过时,但我认为它仍然非常准确。
这是一个片段:
首先,Node.js查看给定模块是否是核心模块 - Node.js带有许多直接编译成可执行二进制文件的模块(例如http,fs,sys,events,path等)。这些核心模块将始终优先于加载算法。
如果给定的模块不是核心模块,Node.js将开始搜索名为“node_modules”的目录。它将从当前目录(相对于Node中当前正在执行的Javascript文件)开始,然后在文件夹层次结构中向上运行,检查node_modules文件夹的每个级别。
...
如果仍然无法以此目录搜索方式找到该文件,Node.js将继续查看“require.paths”数组中列出的目录路径。此数组中的路径值默认为部分由环境变量NODE_PATH定义的路径;但是,它们可以在Node.js应用程序中以编程方式更新。
答案 2 :(得分:0)
当我删除'/'时,我的代码有效。这是我写的,它工作正常。要求( '艾米丽。');所以你可以写var crawler = require('。crawler');如果你已经解决了这个问题,请告诉我们。
答案 3 :(得分:0)
您也可以直接将该函数指定为module.exports的属性,如下所示:
module.exports.kicked = () => ...
虽然这样可行,但每次要调用函数时都需要指定module.exports.kicked(),对于内部文件使用,这会让人烦恼。但这不是一个糟糕的快速解决方案