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

JavaScript提取SQL Server数据存变量异常及HTML展示问题

问题分析与解决

你遇到的是JavaScript异步执行的特性问题,不是代码逻辑错误,执行顺序和你预期不符的原因是:

  1. connectStart() 调用后,内部的 poolConnect.then() 和 request.query() 都是异步任务,JavaScript会把这类任务放到事件队列中,优先执行主线程里的同步代码——也就是最后一行的 console.log(workid),此时异步任务还没完成,workid 自然是空数组。
  2. 等主线程同步代码执行完毕,才会处理事件队列里的异步任务,这时数据库连接、查询才完成,workid 被填充,所以你会看到后面的 console.log(workid) 才有数据。

修正后的代码(用async/await简化异步逻辑)

推荐用async/await重构代码,逻辑更直观,避免回调嵌套:

const pool = new sql.ConnectionPool(config);

let workid = [];

async function connectStart() {
  try {
    // 等待连接池建立连接
    await pool.connect();
    const request = new sql.Request(pool);
    
    // 用await接收查询结果(mssql的query支持Promise)
    const result = await request.query(`
      select * from dbo.xxAIO_det 
      where xxAIO__ch01 like '%172.168.1.70;%' 
      order by xxAIO_NO
    `);
    
    console.log("Results:");
    workid = result.recordset.map(row => row.xxAIO_NO);
    console.log(workid);

    // 直接调用渲染表格的函数,确保数据就绪后再渲染
    renderTable(workid);

  } catch (err) {
    console.error("ERROR", err);
  } finally {
    // 无论成功失败都关闭连接池,避免资源泄漏
    await pool.close();
  }
}

// 渲染HTML表格的函数
function renderTable(data) {
  const table = document.getElementById("your-table-id"); // 替换为你的表格ID
  const tbody = table.querySelector("tbody") || document.createElement("tbody");
  
  data.forEach(id => {
    const row = document.createElement("tr");
    const cell = document.createElement("td");
    cell.textContent = id;
    row.appendChild(cell);
    tbody.appendChild(row);
  });
  
  table.appendChild(tbody);
}

// 执行连接查询
connectStart();

关键注意点

  • 所有依赖数据库数据的逻辑(比如渲染表格)必须放在异步任务完成后执行,要么在await之后,要么在回调函数内部,不能直接放在异步函数外部。
  • mssql库的query方法支持返回Promise,用await替代回调能大幅提升代码可读性和可维护性。
  • 用try/catch/finally处理异常,确保连接池始终会被关闭,避免资源浪费。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:49:53