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

JavaScript中数据库查询结果无法赋值给图表series.data的问题求助

问题原因

这是因为数据库查询是异步操作:你初始化options时,connection.query的回调函数还没执行,valArray仍是空数组;等回调里把数据存入数组时,options已经初始化完成,自然无法拿到新数据。

解决方案

方案1:将图表逻辑放入查询回调中

直接在数据库查询完成后,再生成图表配置并初始化图表:

connection.query(
  `SELECT COUNT(productId) AS NumberOfProducts , productId FROM cart GROUP BY productId ORDER BY productId DESC LIMIT 12`,
  (err, res) => {
    if (err) {
      console.error(err);
      return;
    }
    // 直接从查询结果生成数据数组,替代for循环更简洁
    const valArray = res.map(item => item.NumberOfProducts);
    // 在这里生成图表配置
    const options = {
      chart: {
        height: 360,
        type: "bar",
        stacked: true,
        toolbar: { show: false },
        zoom: { enabled: true },
      },
      plotOptions: {
        bar: { horizontal: false, columnWidth: "15%", endingShape: "rounded" },
      },
      dataLabels: { enabled: false },
      series: [
        {
          name: "Series A",
          data: valArray,
        },
      ],
      xaxis: {
        categories: [
          "Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
        ],
      },
      colors: ["#556ee6", "#f1b44c", "#34c38f"],
      legend: { position: "bottom" },
      fill: { opacity: 1 },
    };
    // 这里执行图表初始化(以ApexCharts为例)
    // new ApexCharts(document.querySelector("#chart"), options).render();
  }
);

方案2:用Async/Await封装,让代码更易读

把异步查询封装成Promise,再用async函数按同步逻辑执行:

// 封装数据库查询为Promise
function getProductCounts() {
  return new Promise((resolve, reject) => {
    connection.query(
      `SELECT COUNT(productId) AS NumberOfProducts , productId FROM cart GROUP BY productId ORDER BY productId DESC LIMIT 12`,
      (err, res) => {
        if (err) reject(err);
        else resolve(res.map(item => item.NumberOfProducts));
      }
    );
  });
}

// 异步初始化图表
async function initChart() {
  try {
    const valArray = await getProductCounts();
    const options = {
      chart: {
        height: 360,
        type: "bar",
        stacked: true,
        toolbar: { show: false },
        zoom: { enabled: true },
      },
      plotOptions: {
        bar: { horizontal: false, columnWidth: "15%", endingShape: "rounded" },
      },
      dataLabels: { enabled: false },
      series: [
        {
          name: "Series A",
          data: valArray,
        },
      ],
      xaxis: {
        categories: [
          "Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
        ],
      },
      colors: ["#556ee6", "#f1b44c", "#34c38f"],
      legend: { position: "bottom" },
      fill: { opacity: 1 },
    };
    // 执行图表初始化
    // new ApexCharts(document.querySelector("#chart"), options).render();
  } catch (err) {
    console.error(err);
  }
}

// 调用初始化函数
initChart();
注意事项
  • 必须确保图表初始化逻辑在数据库查询完成后执行,这是异步场景的核心要求
  • 用map替代for循环生成数据数组,代码更简洁高效
  • 错误处理不要用throw console.log(err),改用console.error并终止流程,避免程序崩溃

内容的提问来源于stack exchange,提问作者programming Digital

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:05:25