node.js模块导出函数结构

时间:2014-06-01 13:47:42

标签: javascript node.js

我想将服务公开为节点中的模块。一旦需要,如:

var MyService = require('../services/myservice');

我希望能够创建模块的实例并使用其功能和属性,如:

var myService = new MyService();
var data = myService.getData();

我在使用导出构建模块时遇到问题。我应该如何使用exports设置myservice.js代码?

//myservice.js    
module.exports = function(dependency){
   return {
      getData: function(){
         return 'The Data';
      },
      name: 'My Service'
   }
} 

尝试使用以下方法实例化实例时出现以下错误:

var myService = new MyService();
  

TypeError:object不是函数

1 个答案:

答案 0 :(得分:4)

让我们说这是我的Service.js模块:

//Service.js
function Service(){}

Service.prototype.greet = function(){
    return "Hello World";
};


module.exports = Service;

然后在另一个模块中我可以做到:

//another.js
var Service = require('./Service');

var service = new Service();
console.log(service.greet()); //yields "Hello World"

这对我有用。您所要做的就是在服务模块中导出Service构造函数。

<强> - 编辑 -

在评论中解决您的问题。

使用module.exports导出的内容是require将返回的内容。如果导出函数,则会返回一个函数:

//greet.js
module.exports = function(){
  return "Hello World";
};

然后你可以这样做:

var greet = require('./greet');
console.log(greet()); //yields 'Hello World'

如果导出对象,则会返回一个对象实例:

//greeter.js
module.exports = {
    greet: function(){
        return 'Hello World';
    }
};

然后你可以这样做:

var greeter = require('./greeter');
console.log(greeter.greet()); //yields 'Hello World'

从逻辑上讲,如果你导出一个构造函数,那么你会得到一个构造函数,这是我最初的例子。

所以,如果你使用你的方法,你会得到一个函数,而不是一个构造函数,当然,除非你的导出函数实际上是你的构造函数。例如:

//greeter.js
module.exports = function Greeter(){
    this.greet = function(){
        return 'Hello World';
    };
};

然后你可以做我原来做的事情:

var Greeter = require('./Greeter');
var greeter = new Greeter();
console.log(greeter.greet());