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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:40:31