NodeJS:module.exports 属性不是函数

NodeJS: module.exports property is not a function

提问人:Idan 提问时间:1/13/2014 更新时间:10/11/2022 访问量:51634

问:

我在模块文件中有以下内容:

module.exports = {
    myfunc: myfunc
};

var myfunc = function(callback){    
        callback(err,reply);    
};

在另一个文件中,我得到了对该模块的引用

var mymodule = require('./modules/mymodule');
mymodule.myfunc(function(err, reply){ ... });

当我调用 mymodule.myfunc() 时,我收到一个错误,说“属性'myfunc'不是函数”。 这仅发生在导出的函数中。同一个模块导出一些“字符串”字段,这些字段工作正常。

JavaScript 节点 .js

评论


答:

36赞 Aioros 1/13/2014 #1

分配时,函数仍未定义。尝试在声明后分配它:module.exportsmyfunc

var myfunc = function(callback){    
    callback(err,reply);    
};

module.exports = {
    myfunc: myfunc
};

评论

11赞 Idan 1/13/2014
嗯,这很尴尬..谢谢。
1赞 ahong 1/10/2019
我已经定义了我的函数,然后尝试在最后导出它,但我仍然收到类似的错误......我可以不导出带有访问修饰符的函数吗?const myfunc ...const
1赞 ahong 1/10/2019
编辑:这很尴尬。显然我直接使用了,这把一切都搞砸了:adrianmejia.com/blog/2016/08/12/......exports = {}
11赞 Ken Lin 4/16/2017 #2

要保留文件顶部 module.exports 的原始顺序,请将初始化更改为声明,以便提升后者。var myfuncfunction myfunc

module.exports = {
    myfunc: myfunc
};

function myfunc(callback){    
    callback(err,reply);    
};

声明被提升,但初始化没有,这就是您的原始示例不起作用的原因。w3schools 对 JavaScript 提升有一个实用的描述。

评论

0赞 Amrit Bera 4/18/2022
我是这些的初学者,我能知道为什么使用“myfunc:myfunc”是什么意思吗?
0赞 testing_22 10/28/2023
@AmritBera分配给对象。在 JS 中,对象是使用大括号括起来的键值对构造的。例如。此答案显示一个对象,其键名为与一个值相关联,该值是也称为 的函数。module.exportslet obj = { foo: 'bar' }myfuncmyfunc
0赞 MDT 10/11/2022 #3

我发现这个烦人的问题的另一种情况是,如果显式只导入我的消费者需要的功能

例如,您导出的模块如下所示

module.exports = {
    func1 : async function func1(){}
    func2 : async function func2(){
        await this.func1(); // causes error : func1 is not a function
    }
}

现在,上述模块的使用者如下所示:

const { func2 } = require('../theExportedModules'); 
//above only imports func2 but not its dependents and is not initialized    
await func2(); //func2 called

现在从你的消费者那里调用,但无法调用,因为它发现这不是一个函数。代码中断!func2()func2()func1()func1()

解决方案导入整个模块:

const theExportedModules = require('../theExportedModules'); 

我们也可以只导入 func1,但它将是一个未使用的变量,我们会收到警告。