Node.js中如何将MySQL表数据存入JS变量?解决赋值失效问题
问题本质:Node.js异步操作时序问题
你遇到的根本问题是**pool.query是异步执行的**:代码执行时,pool.query只是发起了数据库查询请求,不会等待结果返回就继续执行后面的console.log,此时回调函数还没触发,变量自然是空的。回调函数要等数据库查询完成后才会运行,这时候赋值操作才会生效,但这时候外部的console.log早就执行完了。
解决方案
下面提供三种常用的解决方式,根据你的代码风格选择即可:
方案1:把业务逻辑放到回调内部
直接将需要使用数据的所有逻辑(打印、处理、调用其他函数等)写在回调函数里,确保数据赋值完成后再执行后续操作:
const {createPool} = require('mysql'); const pool = createPool({ host: "localhost", user: "root", password: "root123", database: "accounts_db", connectionLimit: 10 }) const sql = 'SELECT * FROM `accounts`'; var dataList = []; var simpleData = null; pool.query(sql, (err, result, fields) => { if (err) { console.log(err); return; } dataList.push(result); simpleData = JSON.parse(JSON.stringify(result)); // 所有需要用数据的逻辑都放在这里 console.log(dataList); // 能正常输出数据 console.log(simpleData); // 能正常输出数据 processAccountData(simpleData); // 调用处理数据的函数 }) function processAccountData(data) { // 这里写数据处理逻辑 console.log("处理后的账户数据:", data); }
方案2:用Promise封装查询,配合async/await(推荐)
把回调式的查询API封装成Promise,再用async/await写同步风格的异步代码,可读性更强:
const {createPool} = require('mysql'); const pool = createPool({ host: "localhost", user: "root", password: "root123", database: "accounts_db", connectionLimit: 10 }) // 封装Promise版本的查询函数 function runQuery(sql) { return new Promise((resolve, reject) => { pool.query(sql, (err, result) => { if (err) reject(err); else resolve(result); }); }); } // 用async函数执行查询 async function getAccounts() { try { const result = await runQuery('SELECT * FROM `accounts`'); const dataList = [result]; const simpleData = JSON.parse(JSON.stringify(result)); // 这里可以正常使用数据 console.log(dataList); console.log(simpleData); processAccountData(simpleData); } catch (err) { console.log("查询出错:", err); } } // 调用查询函数 getAccounts(); function processAccountData(data) { console.log("处理后的账户数据:", data); }
方案3:改用mysql2库(原生支持Promise)
如果可以替换依赖,mysql2是mysql的升级版本,原生支持Promise,无需手动封装:
// 注意引入的是mysql2/promise const {createPool} = require('mysql2/promise'); async function main() { const pool = createPool({ host: "localhost", user: "root", password: "root123", database: "accounts_db", connectionLimit: 10 }); // 直接用await执行查询 const [rows] = await pool.query('SELECT * FROM `accounts`'); const dataList = [rows]; const simpleData = JSON.parse(JSON.stringify(rows)); console.log(dataList); console.log(simpleData); } // 执行主函数并捕获错误 main().catch(err => console.log("查询出错:", err));
内容的提问来源于stack exchange,提问作者Naiya Patel
相关产品推荐
相关产品推荐

