Node.js如何在配置文件中连接MySQL?报connectDb is not a function错误
报错核心原因
两个问题直接导致报错:
config/db.js中定义了connectDb函数,但没有通过module.exports导出,server.js里require拿到的模块导出值不是该函数,调用时直接触发TypeError- 你使用的原生
mysql包是回调风格API,connection.connect()方法本身不返回Promise,外层套async/await没有实际作用,异步写法不匹配
正确实现方式
给两种可直接运行的写法:
写法1:保留原有mysql包适配
修改config/db.js,补全导出,把回调风格的连接方法包装成Promise适配异步调用:
const mysql = require('mysql') const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'mydatabase' }) const connectDb = () => { return new Promise((resolve, reject) => { connection.connect(function (err) { if (err) { console.error("数据库连接报错: ", err.message); return reject(err); } console.log("MySQL服务连接成功"); resolve(connection); }); }); }; // 必须导出函数,外部require才能拿到 module.exports = connectDb;
修改server.js,补全异步调用的异常捕获:
const connectDB = require("./config/db"); // 执行连接,捕获连接失败场景 connectDB().catch(err => { console.error("数据库初始化失败,进程退出", err); process.exit(1); });
写法2:推荐使用mysql2包(原生支持Promise)
原生mysql包维护活跃度低,生产环境更推荐用API兼容、性能更好、原生支持async/await的mysql2包。
首先安装依赖:
npm install mysql2
修改config/db.js:
// 引入promise版本的mysql2 const mysql = require('mysql2/promise'); const connectDb = async () => { try { const connection = await mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'mydatabase' }); console.log("MySQL服务连接成功"); return connection; } catch (err) { console.error("数据库连接报错: ", err.message); throw err; } }; module.exports = connectDb;
server.js的写法和上面写法1的server.js完全一致即可。
额外注意
- 数据库账号、密码、地址这类配置不要硬编码在业务代码里,建议放到环境变量中统一管理,避免敏感信息泄露
- 线上环境建议使用连接池代替单连接,能大幅提升高并发场景下的数据库访问性能
- 数据库连接的异常必须显式捕获,避免连接失败时进程无提示退出,增加排查成本
内容的提问来源于stack exchange,提问作者mier23
相关产品推荐
相关产品推荐

