我多年来一直在NodeJS中创建软件,但我很少考虑模块方面的问题,因为我自己从来不需要这样做。
我已经创建了一个test.js文件,这是我的模块,它包含的就是这个(我试过这个.host,self.host,var主机......什么都没有用)
var tests = function () {
this.host = "http://127.0.0.1/";
};
exports = tests;
在我的server.js中,我尝试使用它,我永远无法主持实际输出
var tests = require('./test.js');
console.log(tests);
console.log(tests.host);
我总是得到这个输出,说测试变量没有我在模块中设置的属性。
sudo node server.js
{}
undefined
答案 0 :(得分:3)
您在host
函数中定义的tests
变量无法通过tests
prototype访问。
这意味着,要访问它,您应该使用tests
运算符创建new
的新实例:
var Tests = require('./tests');
var instance = new Tests();
// Now you can access `instance.host`
另外,正如大卫所说,使用module.exports
导出你的功能。
答案 1 :(得分:1)
不要做exports = tests
。可以exports.tests = tests
或module.exports = tests
。
答案 2 :(得分:0)
console.log(tests());
语句, return
将起作用。
答案 3 :(得分:0)
基本上,您必须首先决定是否希望您的模块只具有可以直接访问的属性,或者您是否希望它具有构造函数,该函数在调用时创建对象,然后具有属性,或者甚至可以只是你调用的常规函数返回一个值。你混合并匹配前两个方案(每个方案的部分),因此它不起作用。我将告诉你两个方案:
这是你的模块导出一个构造函数的方案,你可以从中创建一个对象(当你新建它时):
// test.js module
var tests = function () {
this.host = "http://127.0.0.1/";
};
module.exports = tests;
// main module server.js
var Tests = require('./test.js');
var t = new Tests();
console.log(t.host);
而且,这是您直接导出属性的方案:
// test.js module
module.exports = {
host: "http://127.0.0.1/"
};
// main module server.js
var tests = require('./test.js');
console.log(tests);
console.log(tests.host);
请注意,分配给module.exports
的任何内容都是require()
在加载模块后返回的内容。因此,在第一种情况下,您将分配一个旨在构造函数的函数,因此您必须将其用作构造函数才能使其正常工作。
在我的第二个示例中,我将对象分配给module.exports
,这样您就可以在使用require()
加载模块后将其视为对象。这意味着您可以像对象一样直接访问其属性。