我想将服务公开为节点中的模块。一旦需要,如:
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不是函数
答案 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());