Node.js中无法调用类静态方法的问题排查求助
animal.dog is not a function及导出为空对象的问题 嘿,我来帮你搞定这个问题!你遇到的animal.dog is not a function错误,而且打印animal是空对象,这种情况一般是由下面几个常见原因导致的,咱们逐个排查:
文件路径或文件名错误
先仔细核对require('./animal.js')的路径:如果animal.js不在当前文件的同级目录,或者文件名拼写有误(比如大小写——Linux/macOS系统对文件名大小写敏感,Animal.js和animal.js会被认成两个不同文件),虽然Node.js通常会直接抛出Cannot find module错误,但如果存在同名的空模块或者缓存问题,也可能返回空对象。先确认路径和文件名完全匹配。循环引用导致的未初始化导出
如果你的animal.js和引入它的文件之间存在循环引用(比如A文件require了B,B文件又require了A),Node.js在处理这种循环依赖时,会返回一个未完全初始化的空对象,这就会导致你看到的现象。检查一下代码结构,避免这种互相引用的情况。ES模块与CommonJS语法混用冲突
如果你项目的package.json里设置了"type": "module",Node.js会把所有.js文件当作ES模块处理,这时候module.exports的CommonJS导出语法就不会生效,相当于你没导出任何内容,自然会得到空对象。
解决办法是改用ES模块的导出语法:// animal.js 改成ES模块写法 export default class animal { static dog() { console.log("bark") } }引入的时候也要用ES模块的
import:import animal from './animal.js'反过来,如果是CommonJS环境(没有设置
"type": "module"),确保不要用ES模块的export语法。导出被后续代码覆盖
检查你的animal.js文件,看看是不是在module.exports = animal之后,又写了修改module.exports的代码?比如后面加了module.exports = {},这会直接把之前导出的类覆盖掉,最后导出的就是空对象了。确保module.exports = animal是文件最后一行的导出逻辑,没有被后续代码修改。
按照上面的步骤排查,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Abhishek Singh

