
本文详解 node.js 中使用 `module.exports` 导出多个函数时的常见错误(如 “typeerror: getdata is not a function”),并提供标准、可复用的解构导入方案及最佳实践。
在 Node.js 项目中,当通过 module.exports = { fn1, fn2 } 导出多个函数时,必须使用对象解构语法导入,否则会因引用方式不匹配导致运行时错误(如 getData is not a function)。这是初学者高频踩坑点——本质是 CommonJS 模块系统中 require() 返回的是整个导出对象,而非单个函数。
✅ 正确做法:解构导入(推荐)
修改 app.js 中的导入语句:
// ❌ 错误:分别 require 同一文件两次 → 每次返回完整对象,但被当作函数调用
// const insertData = require("./demo_db");
// const getData = require("./demo_db");
// ✅ 正确:一次 require + 解构获取所需函数
const { insertData, getData } = require("./demo_db");这样 insertData 和 getData 就直接绑定为对应函数引用,可直接调用:
app.get("/api/people", (req, res) => {
getData((err, result) => {
if (err) return res.status(500).json({ error: err });
res.json({ data: result });
});
});⚠️ 常见误区与注意事项
- 不要混用导入风格:若 demo_db.js 使用 module.exports = { ... },则不可用 const db = require('./demo_db'); db.getData(...) 以外的方式跳过解构——除非你显式赋值(如 const db = require('./demo_db'); const getData = db.getData;),但解构更简洁清晰。
- 避免重复 require:多次 require("./demo_db") 不会重复执行模块代码(Node.js 缓存机制保证单例),但语义上易引发误解,且无法直接获得函数引用。
- 命名一致性:确保解构的键名与 module.exports 中的属性名完全一致(区分大小写),例如导出是 { getData },就不能解构为 { getDataFromDB }。
- ES6 模块提示(可选升级):若项目已启用 ES modules("type": "module"),应改用 export { getData, insertData } 和 import { getData, insertData } from './demo_db.js',语法更统一,但需注意 .js 后缀和文件路径规范。
? 补充建议:增强模块健壮性
可在 demo_db.js 末尾添加简单验证,防止误用:
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
// 底部追加(非必需,但利于调试)
if (typeof module.exports.getData !== 'function' || typeof module.exports.insertData !== 'function') {
console.warn('⚠️ demo_db export structure may be incorrect');
}此外,数据库连接建议封装为单例或使用连接池(如 mysql2/promise + async/await),避免并发场景下的连接泄漏——但这属于进阶优化,当前问题核心在于模块导入方式。
总结:导出是对象 → 导入必解构。掌握这一原则,即可彻底规避 is not a function 类型错误,写出清晰、可维护的模块化 Node.js 代码。









