创建Node.JS模块

时间:2015-09-05 23:06:23

标签: javascript node.js

我多年来一直在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

4 个答案:

答案 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 = testsmodule.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()加载模块后将其视为对象。这意味着您可以像对象一样直接访问其属性。