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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:32:39