Node.js执行MySQL查询后无后续代码执行问题求助
问题分析与解决方案
首先,你遇到的核心问题是回调函数的语法错误,导致查询完成后根本不会执行你写的回调逻辑,自然看不到"Query Initiated"的日志。咱们一步步拆解问题:
1. 最致命的语法错误:回调位置写错了
看你贴的代码片段:
connection.query(`SELECT * FROM pedodb WHERE ID='${msg.author.id}'`), function (err, result) { query.on('result', function (err2, result2) { callback(null, rows, fields); console.log("Query Initiated") }) }
这里你把connection.query()的右括号提前了,导致后面的function根本不是query方法的回调参数——相当于你只执行了connection.query()但没给它传回调,后面的函数完全是孤立的、不会被调用的代码!
正确的写法应该是把回调函数放在connection.query()的括号内部,作为第二个参数:
connection.query(`SELECT * FROM pedodb WHERE ID='${msg.author.id}'`, function (err, result) { // 这里才是查询完成后会执行的逻辑 console.log("Query Initiated"); // 其他处理逻辑... });
2. 其他潜在问题
除了语法错误,你的代码还有几个坑:
- SQL注入风险:直接用字符串拼接
${msg.author.id}拼接SQL语句非常危险,恶意用户可以构造特殊ID来执行恶意SQL。应该用参数化查询:// 用?作为占位符,自动处理转义 connection.query('SELECT * FROM pedodb WHERE ID = ?', [msg.author.id], function (err, result) { if (err) throw err; console.log("Query Initiated"); console.log("查询结果:", result); }); - 未定义的变量:你代码里的
query、rows、fields都是未定义的——connection.query()的回调参数是err和result(查询结果数组),普通查询不需要监听result事件,直接用回调里的result就行。 - 回调逻辑混乱:你写的
callback(null, rows, fields)里的rows和fields根本没来源,应该用回调参数里的result和fields(如果需要的话)。
3. 针对200多行混乱代码的小建议
既然你懒得手动整理200多行代码,可以试试这些方法让代码更清晰:
- 改用Promise封装MySQL查询,配合
async/await,避免嵌套回调:// 封装一个Promise版的查询函数 function queryDB(sql, params) { return new Promise((resolve, reject) => { connection.query(sql, params, (err, result, fields) => { if (err) reject(err); else resolve({ result, fields }); }); }); } // 调用时用async/await async function fetchUser(id) { try { const { result } = await queryDB('SELECT * FROM pedodb WHERE ID = ?', [id]); console.log("Query Initiated"); console.log("用户数据:", result); // 后续逻辑... } catch (err) { console.error("查询出错:", err); } } // 使用 fetchUser(msg.author.id); - 用代码格式化工具(比如Prettier)的时候,可以先把代码按逻辑分段,再批量格式化,比直接扔整个文件进去效果好。
内容的提问来源于stack exchange,提问作者WillEridian
相关产品推荐
相关产品推荐

