如何从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
相关产品推荐
相关产品推荐

