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

调用预定义回调方法时参数未定义问题及正确传参咨询

解决MySQL回调函数中参数未定义的问题

咱们直接拆解问题根源和修复方案:

问题出在哪?

  1. 错误调用回调函数:你在doQuery里写connection.query(query, callback(error, results,fields))时,error、results、fields这三个变量在当前作用域根本不存在!connection.query的回调函数才会自动接收这三个参数,你不能直接把callback当成普通函数调用并传未定义的变量。
  2. 回调函数未声明参数:调用doQuery时,你传入的回调函数没有声明要接收的参数,导致函数内部用error和results时自然会报未定义错误。
  3. 潜在的异步时序问题:你把connection.end()放在connection.query后面,这会导致查询还没完成就关闭连接(因为query是异步操作)。

修正后的完整代码

var mysql = require('mysql');
var connection = mysql.createConnection({
 host : 'localhost',
 user : 'root',
 password : 'root',
 database : 'database'
});

function doQuery(query, callback){
 // connection.connect()可以省略,query会自动建立连接
 connection.query(query, function(error, results, fields) {
  // 先处理错误,遵循Node.js回调规范:第一个参数传错误
  if (error) {
   return callback(error);
  }
  // 查询完成后再关闭连接
  connection.end();
  // 把结果传给上层回调
  callback(null, results, fields);
 });
}

// 调用时必须给回调函数声明参数
doQuery('SELECT 1 + 1 AS sum', function (error, results, fields){
 if (error) throw error;
 console.log(results[0].sum);
})

关键修改点说明

  • 正确传递回调函数:把回调逻辑交给connection.query处理,由它在查询完成后自动传入error、results、fields参数,而不是手动调用callback。
  • 显式声明回调参数:调用doQuery时,回调函数必须明确声明要接收的参数,这样函数内部才能正常访问这些变量。
  • 修复异步时序问题:将connection.end()移到query的回调函数内部,确保查询操作完成后再关闭连接。
  • 遵循Node.js回调规范:把错误作为回调函数的第一个参数传递,这是Node.js异步代码的标准写法,方便上层统一处理错误。

内容的提问来源于stack exchange,提问作者ramoncs11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:01:11