Node.js连接MySQL无响应,con.on('error')未触发求助
问题分析与解决方案
嘿,我一眼就看穿你代码里的关键问题了——你创建了数据库连接对象,但从来没调用con.connect()来实际发起连接!这就是为啥你的代码完全没输出的核心原因:连接流程根本没启动,con.on('error')事件自然不会被触发,连正常的连接成功逻辑都没机会跑起来。
具体问题拆解:
- 你只给连接对象绑定了
error事件监听,但没有触发连接动作。MySQL模块的createConnection()只是创建一个配置好的连接对象,不会主动发起连接,必须手动调用connect()才算正式启动连接流程。 - 更关键的是,你把用户交互(prompt)和数据库查询的核心逻辑都塞进了
error事件回调里——这完全搞反了时机!error事件只有在连接过程中出现错误时才会触发,正常连接成功的话,这个回调根本不会执行。
修复步骤:
- 调用
con.connect()启动连接:这是触发整个连接流程的关键一步,没有它所有事件监听都是摆设。 - 拆分事件处理逻辑:把正常连接成功后的业务逻辑(prompt交互、数据库查询)放在
connect事件回调里,error事件只专门处理连接错误。 - 完善错误处理链条:用户交互、查询过程中都可能出错,要在对应回调里逐一处理,避免静默失败。
修正后的代码:
var mysql = require('mysql'); var prompt = require('prompt'); var con = mysql.createConnection({ host: "blabla", user: "bla", password: "bla", database: "blabla" }); var schema_select = { properties: { select: { description: 'what you wanna select bro? :' }, from: { description: 'from where bro ? :' }, ask_where: { description: 'do you wanna add where ? Y/N :' }, where: { description: 'say where then :', ask: function() { return prompt.history('ask_where').value == 'Y'; } } } }; // 专门处理连接阶段的错误 con.on('error', function(err) { console.error("[mysql connection error]", err); process.exit(1); // 出错后直接退出进程,避免无意义挂起 }); // 连接成功后执行核心业务逻辑 con.connect(function(err) { if (err) { console.error("[mysql connect failed]", err); return; } console.log("Connected to database successfully!"); // 启动用户交互 prompt.get(schema_select, function (err, result) { if (err) { console.error("[prompt interaction error]", err); return; } // 组装SQL语句 var sql_request = `SELECT ${result.select} FROM ${result.from}`; if (result.ask_where == 'Y'){ sql_request += ` WHERE ${result.where}`; } // 执行数据库查询 con.query(sql_request, function (err, req_result) { if (err) { console.error("[mysql query error]", err); return; } console.log("Query result:", req_result); // 查询完成后关闭连接,避免资源泄漏 con.end(); }) }); });
额外提醒:
- 注意SQL注入风险:你直接把用户输入拼接到SQL语句里,这是非常危险的操作!建议改用参数化查询,比如
con.query('SELECT ?? FROM ?? WHERE ?', [result.select, result.from, whereConditions], ...)来规避注入风险。 - 记得在查询完成后调用
con.end()关闭连接,避免长期占用数据库连接资源。
内容的提问来源于stack exchange,提问作者mitoufle
相关产品推荐
相关产品推荐

