Node.js数组值存取问题:无法存储数据库查询结果
嗨,这个问题我太熟啦!你遇到的是Node.js里典型的异步操作顺序问题,咱们一步步来解决:
为什么输出是空数组?
con.query是异步执行的——Node.js不会等着数据库查询完成再往下跑代码,而是直接先执行后面的console.log(button_settings)。这时候数据库查询还没返回结果,push操作根本没机会执行,所以数组自然是空的。
解决方法
方法1:把逻辑放到回调函数里(最直接的写法)
把需要使用button_settings的代码(比如打印、后续业务逻辑)全部放到con.query的回调函数里,这样就能保证代码在拿到数据库结果后再执行:
var button_settings = []; con.query("SELECT * from ht_button", function (err, result, fields) { if (err) throw err; // 其实result本身就是查询到的结果数组,直接赋值更合理,不用push(push会让数组嵌套) button_settings = result; // 在这里处理结果,比如打印 console.log(button_settings); // 其他需要用button_settings的业务逻辑也写在这里 });
方法2:用Promise + async/await(更优雅的写法)
如果你的业务逻辑比较复杂,回调嵌套会显得很乱,用Promise封装查询操作,再配合async/await可以让代码看起来像同步执行一样:
// 先把数据库查询封装成Promise function getButtonSettings() { return new Promise((resolve, reject) => { con.query("SELECT * from ht_button", function (err, result, fields) { if (err) reject(err); else resolve(result); }); }); } // 用async函数调用 async function handleButtonSettings() { try { const button_settings = await getButtonSettings(); console.log(button_settings); // 这里可以直接用button_settings做后续操作 } catch (err) { console.error("查询出错:", err); } } // 执行函数 handleButtonSettings();
内容的提问来源于stack exchange,提问作者user9554084
相关产品推荐
相关产品推荐

