节点 module.exports returns 未定义
Node module.exports returns undefined
我遇到了 Node.js 和 module.exports
的问题。我知道 module.exports
是对 return 对象的调用,该对象具有分配给它的任何属性。
如果我有这样的文件结构:
// formatting.js
function Format(text) {
this.text = text;
}
module.exports = Format;
有了这个:
// index.js
var formatting = require('./formatting');
有没有办法初始化一个 Format
对象并像这样使用它?
formatting('foo');
console.log(formatting.text);
每当我尝试这样做时,我都会收到一个错误 formatting is not a function
。然后我必须这样做:
var x = new formatting('foo');
console.log(x.text);
这看起来很麻烦。
在 keypress
和 request
等模块中,它们可以立即使用,如下所示:
var keypress = require('keypress');
keypress(std.in);
或
var request = require('request);
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
这是如何工作的?
module.exports = Format;
这将 return Format
构造函数,而您 require('./formatting')
另一方面,下面的代码将 return Format
的一个实例,您可以直接调用它的方法:
module.exports = new Format();
试试这个:
模块格式:
function Format() {
this.setter = function(text) {
this.text = text;
}
this.show = function() {
console.log(this.text);
}
}
//this says I want to return empty object of Format type created by Format constructor.
module.exports = new Format();
index.js
var formatting = require('./formatting');
formatting('Welcome');
console.log(formatting.show());
我建议将 new
调用包装在它自己的函数中,然后返回:
function Format(text) {
this.text = text;
}
function formatting(text) {
return new Format(text);
}
module.exports = formatting;
这样你应该仍然可以做到:
var format = formatting('foo');
console.log(format.text);
编辑:
在 request
方面,您必须记住的一件事是,在 JavaScript 中,函数仍然是对象。这意味着您仍然可以向它们添加属性和方法。这就是他们在 request
中所做的,尽管总的来说解释这个答案中的每个细节有点太复杂了。据我所知,他们向 request
函数添加了一堆方法(对象上的函数)。这就是为什么您可以立即调用 request(blah, blah).pipe(blah).on(blah)
等方法的原因 基于调用 request
函数返回的内容,您可以在其后面链接一些其他方法。当您使用请求时,它不是一个对象,而是一个函数(但从技术上讲仍然是一个对象)。要演示函数如何仍然是对象以及如何向它们添加方法,请查看这个简单的示例代码:
function hey(){
return;
}
hey.sayHello = function(name) {
console.log('Hello ' + name);
}
hey.sayHello('John'); //=> Hello John
这基本上就是他们正在做的事情,只是更复杂,而且还有更多的事情要做。
我遇到了 Node.js 和 module.exports
的问题。我知道 module.exports
是对 return 对象的调用,该对象具有分配给它的任何属性。
如果我有这样的文件结构:
// formatting.js
function Format(text) {
this.text = text;
}
module.exports = Format;
有了这个:
// index.js
var formatting = require('./formatting');
有没有办法初始化一个 Format
对象并像这样使用它?
formatting('foo');
console.log(formatting.text);
每当我尝试这样做时,我都会收到一个错误 formatting is not a function
。然后我必须这样做:
var x = new formatting('foo');
console.log(x.text);
这看起来很麻烦。
在 keypress
和 request
等模块中,它们可以立即使用,如下所示:
var keypress = require('keypress');
keypress(std.in);
或
var request = require('request);
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
这是如何工作的?
module.exports = Format;
这将 return Format
构造函数,而您 require('./formatting')
另一方面,下面的代码将 return Format
的一个实例,您可以直接调用它的方法:
module.exports = new Format();
试试这个:
模块格式:
function Format() {
this.setter = function(text) {
this.text = text;
}
this.show = function() {
console.log(this.text);
}
}
//this says I want to return empty object of Format type created by Format constructor.
module.exports = new Format();
index.js
var formatting = require('./formatting');
formatting('Welcome');
console.log(formatting.show());
我建议将 new
调用包装在它自己的函数中,然后返回:
function Format(text) {
this.text = text;
}
function formatting(text) {
return new Format(text);
}
module.exports = formatting;
这样你应该仍然可以做到:
var format = formatting('foo');
console.log(format.text);
编辑:
在 request
方面,您必须记住的一件事是,在 JavaScript 中,函数仍然是对象。这意味着您仍然可以向它们添加属性和方法。这就是他们在 request
中所做的,尽管总的来说解释这个答案中的每个细节有点太复杂了。据我所知,他们向 request
函数添加了一堆方法(对象上的函数)。这就是为什么您可以立即调用 request(blah, blah).pipe(blah).on(blah)
等方法的原因 基于调用 request
函数返回的内容,您可以在其后面链接一些其他方法。当您使用请求时,它不是一个对象,而是一个函数(但从技术上讲仍然是一个对象)。要演示函数如何仍然是对象以及如何向它们添加方法,请查看这个简单的示例代码:
function hey(){
return;
}
hey.sayHello = function(name) {
console.log('Hello ' + name);
}
hey.sayHello('John'); //=> Hello John
这基本上就是他们正在做的事情,只是更复杂,而且还有更多的事情要做。