使用require导出Class时出现错误的问题排查
Node.js模块导出错误导致类继承失败的解决方法
问题概述
我在项目中尝试导出ReplitDB类,让MoodDB类继承它,但试了两种导出方式都报错,排查许久仍未解决,希望明确问题根源。
错误代码与对应报错
方式A(ReplitDB.js)
... exports.module = ReplitDB;
触发报错:
TypeError: Class extends value #<Object> is not a constructor or null at Object.<anonymous> (/home/runner/Class-Extends-Error/libs/MoodDB.js:7:22) at Module._compile (node:internal/modules/cjs/loader:1159:14) at Module._extensions..js (node:internal/modules/cjs/loader:1213:10) at Module.load (node:internal/modules/cjs/loader:1037:32) at Module._load (node:internal/modules/cjs/loader:878:12) at Module.require (node:internal/modules/cjs/loader:1061:19) at require (node:internal/modules/cjs/helpers:103:18) at Object.<anonymous> (/home/runner/Class-Extends-Error/index.js:12:16) at Module._compile (node:internal/modules/cjs/loader:1159:14)
方式B(ReplitDB.js)
modules.export = ReplitDB ;
触发报错:
ReferenceError: modules is not defined at Object.<anonymous> (/home/runner/Class-Extends-Error/libs/ReplitDB.js:110:1) at Module._compile (node:internal/modules/cjs/loader:1159:14) at Module._extensions..js (node:internal/modules/cjs/loader:1213:10) at Module.load (node:internal/modules/cjs/loader:1037:32) at Module._load (node:internal/modules/cjs/loader:878:12) at Module.require (node:internal/modules/cjs/loader:1061:19) at require (node:internal/modules/cjs/helpers:103:18) at Object.<anonymous> (/home/runner/Class-Extends-Error/libs/MoodDB.js:23:18) at Module._compile (node:internal/modules/cjs/loader:1159:14)
继承逻辑代码(MoodDB.js)
const ReplitDB = require('./ReplitDB.js') class MoodDB extends ReplitDB { constructor(){ super() } ... }
问题根源
两种导出方式均违反Node.js CommonJS模块的语法规则:
- 方式A:语法顺序错误,
exports.module应为module.exports。错误写法导致导出的是包含module属性的普通对象,而非ReplitDB类本身,因此继承时会提示“不是构造函数”。 - 方式B:拼写错误,
modules.export应为module.exports(单数module,复数exports),因此触发“modules未定义”的引用错误。
解决方法
修改ReplitDB.js的导出代码为正确的CommonJS语法:
// 正确导出类 module.exports = ReplitDB;
修改后,require('./ReplitDB.js')将直接获取ReplitDB类,MoodDB继承时即可正常调用构造函数。
若项目使用ES模块规范(需在package.json中配置"type": "module"),也可使用以下写法:
// ReplitDB.js 中导出 export default ReplitDB; // MoodDB.js 中导入 import ReplitDB from './ReplitDB.js';
内容的提问来源于stack exchange,提问作者The Jaded George
相关产品推荐
相关产品推荐

