使用Consign自动加载模块时,Node.js连接MySQL出现db未定义错误
解决Consign加载顺序导致的数据库连接报错问题
嘿,我一眼就瞅出问题根源了——你把Consign的模块加载顺序搞反了!
你看,在Server.js里,你先让Consign加载了./src/routes,然后才加载./src/config/db.js。这就导致当路由模块(比如Home.route.js)被初始化并试图访问app.config.db的时候,这个属性根本还没被Consign注入到app对象里,自然就会抛出Cannot read property 'db' of undefined的错误。
第一步:调整Consign的加载顺序
先加载数据库配置模块,再加载路由——毕竟路由依赖数据库连接功能,得让db模块先完成注入,路由才能正常调用。修改你的Server.js里的Consign代码:
consign() .then('./src/config/db.js') // 先加载数据库配置,把db注入到app.config .include('./src/routes') // 再加载路由,此时app.config.db已经存在 .then('./src/models') .into(app);
第二步:确保数据库连接的正确调用
你的db.js导出的是一个返回connMySQL函数的函数,所以在路由里调用app.config.db()后,你拿到的是connMySQL这个函数本身,还需要执行它来创建并获取连接,记得加上错误处理避免崩溃:
module.exports = function (app) { app.get('/', (req, res) => { console.log("Call the Connection Here") var connMySQL = app.config.db(); // 获取connMySQL函数 var connection = connMySQL(); // 执行函数创建连接 // 尝试连接数据库 connection.connect((err) => { if (err) { console.error('数据库连接失败:', err); res.status(500).send('数据库连接出错'); return; } console.log('数据库连接成功,线程ID:', connection.threadId); // 这里可以写你的数据库操作逻辑 // 操作完成后记得关闭连接(如果不用连接池的话) connection.end(); res.send('连接成功!'); }); }); }
额外优化建议
另外提一句,用mysql.createConnection每次创建新连接不是最优方案,推荐使用MySQL的连接池mysql.createPool,这样可以复用连接,避免频繁创建销毁连接带来的性能损耗。你可以把db.js改成这样:
var mysql = require('mysql'); var poolMySQL = function () { console.log("连接池已初始化") return mysql.createPool({ host: 'localhost', user: 'root', password: '', database: 'agimplant', connectionLimit: 10 // 设置连接池最大连接数 }); } module.exports = function () { console.log("db模块已加载") return poolMySQL; }
然后在路由里调用的时候,直接从连接池获取连接:
var pool = app.config.db()(); pool.getConnection((err, connection) => { if (err) throw err; // 使用连接操作数据库 connection.query('SELECT * FROM your_table', (error, results) => { connection.release(); // 释放连接回连接池 if (error) throw error; res.send(results); }); });
这样你的数据库连接会更稳定高效。
内容的提问来源于stack exchange,提问作者Tiago Silveira
相关产品推荐
相关产品推荐

