Node.js中如何存储MySQL查询结果至变量并解决异步问题
解决Node.js异步MySQL查询结果存储问题
这个问题在Node.js异步编程里太常见了!核心原因就是你提到的——Node.js不会等待异步的数据库查询完成,就继续执行后面的代码,所以你在函数外部访问savedServices的时候,查询还没结束,自然是空数组。下面给你两种最常用的解决方案,都是业界现在推荐的写法:
方案一:使用回调函数(传统但实用)
把依赖查询结果的逻辑放在查询的回调函数里,或者通过自定义回调来传递结果:
let savedServices = []; // 封装查询函数,传入回调处理结果 function getServices(callback) { connection.query('SELECT * FROM services', (error, rows) => { if (error) { console.error('查询失败:', error); callback(error, null); return; } // 把结果赋值给变量 savedServices = rows; // 调用回调,传递结果 callback(null, savedServices); }); } // 使用时,在回调里处理结果 getServices((err, services) => { if (err) return; console.log('查询到的服务:', services); // 所有需要用这个结果的逻辑都写在这里,比如数据处理、返回给前端等 });
方案二:使用Promise + Async/Await(现代推荐写法)
这种写法让异步代码看起来像同步代码,可读性更强,也是现在Node.js开发的主流方式:
首先把数据库查询封装成Promise:
// 封装通用查询函数,返回Promise function queryDB(sql) { return new Promise((resolve, reject) => { connection.query(sql, (error, rows) => { if (error) reject(error); else resolve(rows); }); }); }
然后用async函数来获取并存储结果:
async function fetchAndSaveServices() { let savedServices = []; try { // await会等待Promise完成,拿到结果后再继续执行 const rows = await queryDB('SELECT * FROM services'); savedServices = rows; console.log('存储的服务:', savedServices); // 在这里处理你的业务逻辑,比如过滤数据、生成响应等 return savedServices; } catch (err) { console.error('查询出错:', err); // 可以在这里统一处理错误,比如返回错误信息 throw err; } } // 调用方式1:用.then()处理结果 fetchAndSaveServices().then(services => { console.log('拿到结果:', services); }).catch(err => { // 处理错误 }); // 调用方式2:在另一个async函数里直接await async function anotherBusinessLogic() { try { const services = await fetchAndSaveServices(); // 直接使用services变量做后续处理 } catch (err) { console.error('处理失败:', err); } }
关键提醒
- 永远不要在
async函数外部直接使用await,必须在async函数内部或者ES模块的顶层使用。 - 所有依赖查询结果的逻辑,必须放在查询完成之后(回调里、
.then()里或者await之后),否则都会拿到初始的空数组。 - 一定要做好错误处理,避免未捕获的异步错误导致程序崩溃。
内容的提问来源于stack exchange,提问作者Abdulrhman Alsri
相关产品推荐
相关产品推荐

