Node.js NodeJS-自定义模块-无法调用我的自定义模块

Node.js NodeJS-自定义模块-无法调用我的自定义模块,node.js,express,module,Node.js,Express,Module,我正在尝试一些从web截取的代码,以了解自定义节点的工作情况。 下面是我试图执行的代码: /** * mymodule.js Created by vinod on 4/13/2015. */ var exports = module.exports = {}; var myfunct = function() { console.log("Just used myfunct()... "); } exports = myfunct; /** * testclient.js Cr

我正在尝试一些从web截取的代码,以了解自定义节点的工作情况。 下面是我试图执行的代码:

/**
* mymodule.js Created by vinod on 4/13/2015.
*/

var exports = module.exports = {};
var myfunct = function()
{
    console.log("Just used myfunct()... ");
}

exports = myfunct;

/**
 * testclient.js Created by vinod on 4/13/2015.
 */

var extMod = require('./mymodule.js')
extMod.myfunct();
这将引发以下错误:

extMod.myfunct();
   ^
TypeError: undefined is not a function
at Object.<anonymous> (d:\nodews\learnyounode\testjs\testclient.js:7:8)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3

Process finished with exit code 1
extMod.myfunct();
^
TypeError:undefined不是函数
反对。(d:\nodews\learnyonode\testjs\testclient.js:7:8)
在模块处编译(Module.js:460:26)
在Object.Module.\u extensions..js(Module.js:478:10)
在Module.load(Module.js:355:32)
在Function.Module.\u加载(Module.js:310:12)
位于Function.Module.runMain(Module.js:501:10)
启动时(node.js:129:16)
在node.js:814:3
进程已完成,退出代码为1

实际上,您的代码中有两处错误。第一个是关于什么在什么时候引用什么

var exports = module.exports = {};
在这一行之后,
module.exports
和您的本地
exports
都引用相同的(空)对象。一切都很好

var myfunct = function() {
    console.log("Just used myfunct()... ");
}
现在定义一个函数-这里没有问题

 exports = myfunct;
现在您更改了
导出的内容<代码>导出
现在引用刚刚创建的函数<然而,code>module.exports从未更改,因此仍然从一开始就指向空对象。因此,您实际上只是在导出此模块中的空对象

代码的第二个问题是关于导出的内容。所以为了修复你的模块,我们可以替换这个

 exports = myfunct;
由此

 module.exports = myfunct;
我相信它会起作用的

如果您现在仔细观察,您会发现,您只是导出了函数本身。在通过将其包含在其他模块中之后

var extMod = require('./mymodule.js')
您将只拥有函数,而不是对象,其中函数是一个属性。所以你可以通过

extMod();

另一个解决方案是,根据第二个模块的调用调整第一个模块。为此,我们需要将
myfunct
作为结果对象的属性:

module.exports.myfunct = myfunct;
现在,第二个模块中的调用应该可以工作了。这是因为我们没有在导出中替换空对象,而只是用一个新属性来扩充它,该属性的值是以前定义的函数


从后面的示例中,您可以看到一个有趣的点,即您定义的函数、导出函数的名称和使用函数的名称不一定必须相同。

感谢您的帮助,了解此失败的原因。非常感谢Sirko。这起到了帮助和作用。感谢您的详细解释。