You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js连接MySQL无响应,con.on('error')未触发求助

问题分析与解决方案

嘿,我一眼就看穿你代码里的关键问题了——你创建了数据库连接对象,但从来没调用con.connect()来实际发起连接!这就是为啥你的代码完全没输出的核心原因:连接流程根本没启动,con.on('error')事件自然不会被触发,连正常的连接成功逻辑都没机会跑起来。

具体问题拆解:

  • 你只给连接对象绑定了error事件监听,但没有触发连接动作。MySQL模块的createConnection()只是创建一个配置好的连接对象,不会主动发起连接,必须手动调用connect()才算正式启动连接流程。
  • 更关键的是,你把用户交互(prompt)和数据库查询的核心逻辑都塞进了error事件回调里——这完全搞反了时机!error事件只有在连接过程中出现错误时才会触发,正常连接成功的话,这个回调根本不会执行。

修复步骤:

  1. 调用con.connect()启动连接:这是触发整个连接流程的关键一步,没有它所有事件监听都是摆设。
  2. 拆分事件处理逻辑:把正常连接成功后的业务逻辑(prompt交互、数据库查询)放在connect事件回调里,error事件只专门处理连接错误。
  3. 完善错误处理链条:用户交互、查询过程中都可能出错,要在对应回调里逐一处理,避免静默失败。

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:22