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

如何从Node.js嵌套函数外部访问数据库查询结果数组?

问题原因

你这是典型的异步执行顺序问题。dbo.query是异步方法,它的回调函数要等数据库返回数据后才会触发执行;而你写的第二个console.log是同步代码,会在dbo.query发起请求后立刻执行——这时候global.ret还没被赋值,自然拿不到正确结果。

解决方案

方案1:用自定义回调传递结果

把需要处理result的逻辑通过回调函数传递,确保在数据返回后再执行:

function executeQuery(dbo, sql, callback) {
  dbo.query(sql, function (err, result){
    if (err) return callback(err);
    console.log('first:'+result[1]['idUser']);
    callback(null, result);
  });
}

// 调用示例
executeQuery(dbo, '你的SQL语句', function(err, result) {
  if (err) throw err;
  console.log('second:'+result[1]['idUser']);
  // 在这里写所有需要用result的逻辑
});

方案2:用Promise封装(现代写法)

把异步操作封装成Promise,更灵活地控制流程:

function executeQuery(dbo, sql) {
  return new Promise((resolve, reject) => {
    dbo.query(sql, function (err, result){
      if (err) return reject(err);
      console.log('first:'+result[1]['idUser']);
      resolve(result);
    });
  });
}

// 调用示例
executeQuery(dbo, '你的SQL语句')
  .then(result => {
    console.log('second:'+result[1]['idUser']);
    // 处理结果
  })
  .catch(err => {
    throw err;
  });

方案3:async/await(最简洁写法)

基于Promise封装,用async/await让异步代码看起来像同步:

function executeQuery(dbo, sql) {
  return new Promise((resolve, reject) => {
    dbo.query(sql, function (err, result){
      if (err) return reject(err);
      console.log('first:'+result[1]['idUser']);
      resolve(result);
    });
  });
}

// 必须在async函数内使用await
async function handleQuery() {
  try {
    const result = await executeQuery(dbo, '你的SQL语句');
    console.log('second:'+result[1]['idUser']);
    // 处理结果
  } catch (err) {
    throw err;
  }
}

// 执行函数
handleQuery();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:20:34