Node module.exports返回undefined

时间:2015-12-29 04:43:25

标签: javascript node.js node-modules

我遇到Node.js和module.exports的问题。我理解module.exports是一个返回一个对象的调用,该对象具有分配的任何属性。

如果我有这样的文件结构:

// 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);

这看起来很麻烦。

在像keypressrequest这样的模块中,它们可以在门外使用,如下所示:

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.
  }
})

这是如何运作的?

3 个答案:

答案 0 :(得分:5)

我建议将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

这基本上就是他们正在做的事情,只是更复杂,而且还有很多东西在继续。

答案 1 :(得分:2)

module.exports = Format;

这将在您Format

时返回require('./formatting')构造函数

另一方面,下面的代码将返回Format的实例,您可以直接调用方法:

module.exports = new Format();

答案 2 :(得分:1)

试试这个:

模块格式化:

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());