提问人:Idan 提问时间:1/13/2014 更新时间:10/11/2022 访问量:51634
NodeJS:module.exports 属性不是函数
NodeJS: module.exports property is not a function
问:
我在模块文件中有以下内容:
module.exports = {
myfunc: myfunc
};
var myfunc = function(callback){
callback(err,reply);
};
在另一个文件中,我得到了对该模块的引用
var mymodule = require('./modules/mymodule');
mymodule.myfunc(function(err, reply){ ... });
当我调用 mymodule.myfunc() 时,我收到一个错误,说“属性'myfunc'不是函数”。 这仅发生在导出的函数中。同一个模块导出一些“字符串”字段,这些字段工作正常。
答:
36赞
Aioros
1/13/2014
#1
分配时,函数仍未定义。尝试在声明后分配它:module.exports
myfunc
var myfunc = function(callback){
callback(err,reply);
};
module.exports = {
myfunc: myfunc
};
评论
11赞
Idan
1/13/2014
嗯,这很尴尬..谢谢。
1赞
ahong
1/10/2019
我已经定义了我的函数,然后尝试在最后导出它,但我仍然收到类似的错误......我可以不导出带有访问修饰符的函数吗?const myfunc ...
const
11赞
Ken Lin
4/16/2017
#2
要保留文件顶部 module.exports 的原始顺序,请将初始化更改为声明,以便提升后者。var myfunc
function 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.exports
let obj = { foo: 'bar' }
myfunc
myfunc
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,但它将是一个未使用的变量,我们会收到警告。
评论