Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node module.exports返回未定义的_Javascript_Node.js_Node Modules - Fatal编程技术网

Javascript Node module.exports返回未定义的

Javascript Node module.exports返回未定义的,javascript,node.js,node-modules,Javascript,Node.js,Node Modules,我对Node.js和模块.exports有问题。我知道module.exports是一个返回对象的调用,该对象具有分配给它的任何属性 如果我有这样的文件结构: // formatting.js function Format(text) { this.text = text; } module.exports = Format; var x = new formatting('foo'); console.log(x.text); var keypress = require('

我对Node.js和
模块.exports有问题。我知道
module.exports
是一个返回对象的调用,该对象具有分配给它的任何属性

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

// formatting.js

function Format(text) {
    this.text = text;
}

module.exports = Format;
var x = new formatting('foo');
console.log(x.text);
var keypress = require('keypress');

keypress(std.in);
为此:

// index.js

var formatting = require('./formatting');
有没有办法初始化
格式
对象并像这样使用它

formatting('foo');
console.log(formatting.text);
每当我尝试这样做时,我都会得到一个错误,即
格式化不是一个函数
。然后我必须这样做:

// formatting.js

function Format(text) {
    this.text = text;
}

module.exports = Format;
var x = new formatting('foo');
console.log(x.text);
var keypress = require('keypress');

keypress(std.in);
这看起来很麻烦

在诸如
按键
请求
之类的模块中,它们可以直接在闸门外使用,如下所示:

// formatting.js

function Format(text) {
    this.text = text;
}

module.exports = Format;
var x = new formatting('foo');
console.log(x.text);
var keypress = require('keypress');

keypress(std.in);

这是怎么回事

module.exports = 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);

编辑

对于
请求
之类的东西,您必须记住的一点是,在JavaScript中,函数仍然是对象。这意味着您仍然可以向其添加属性和方法。这就是他们在
request
中所做的,尽管总的来说,解释这个答案中的每个细节有点太复杂了。据我所知,他们向
请求
函数添加了一系列方法(对象上的函数)。这就是为什么您可以立即调用那些方法,比如
request(blah,blah).pipe(blah).on(blah)
基于调用
request
函数返回的内容,您可以将其他一些方法链接到它的后面。当您使用request时,它不是一个对象,而是一个函数(但在技术上仍然是一个对象)。要演示函数如何仍然是对象以及如何向其添加方法,请查看以下简单示例代码:

function hey(){
  return;
}

hey.sayHello = function(name) {
  console.log('Hello ' + name);
} 

hey.sayHello('John'); //=> Hello John

这基本上就是他们正在做的事情,只是要复杂得多,要做的事情也很多。

这行得通吗?var formatting=require('./formatting.js');在代码中,您将从格式化模块返回函数构造函数。相反,您希望将其作为对象返回,以便您可以直接使用。@PardeepDhingra我该怎么做?@apizzimen我检查我的答案。如果我这样做,然后执行
格式化('text')
,然后我试着控制台。记录对象的
text
属性,它仍然说
格式化不是函数。我做错了什么吗?是的,因为一旦你用
new
的构造函数创建了一个对象,它就不再是一个函数,而是一个通过将构造函数应用到新对象而创建的对象。因此,如果您想要一个模块同时是一个对象和一个函数,比如jQuery,那么构造函数模式就不是正确的方法。相反,首先导出一个函数,然后将属性附加到它。@lleaff因此,如果我执行第二个选项,然后在index.js中运行
format('foo')
,那么它会将'foo'分配给
text
属性吗
module.exports
返回类的一个空实例,然后用
format('foo')
调用它的构造函数,正确地分配属性?@apizzionti Checkout Sam的回答我想这就是你的意思。你能说说
module.exports=new format()的一些细节吗?这对你有用吗?在调用
formatting('Welcome')
的行上,它仍然返回错误
formatting不是一个函数。
。因为fromatting是format类的对象,所以我们不能将“text”传递给对象,我们需要一个setter方法。是的,这是可行的,但是可以通过调用
formatting('foo')来初始化对象吗
而不是
var format=formatting('foo')
?你是什么意思?初始化时,是否要将返回的对象设置为变量?是的,我想可以做一些类似于
console.log(格式化('foo').text)
的事情,但这有什么意义呢?是的,我明白了。在第二个代码块中,
formatting
是对
require('./formatting')
的引用,对吗?是的,如果在所有其他require的顶部,您没有
var formatting=require('./formatting')
,这就是我从中获得
formatting()
函数的原因。此外,如果您对
request
的工作原理感到好奇,您应该查看使其运行的代码: