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

Node.js中Promise执行T-SQL查询无响应问题排查

问题排查与修复方案

我帮你梳理下代码里的问题,这几个点是导致后续逻辑无法执行的关键:

1. 致命错误:提前关闭数据库连接

sql.connect()是异步操作,它的Promise还没完成时,你就同步调用了sql.close(),直接掐断了正在建立的连接,导致then里的连接成功逻辑完全跑不起来。必须把关闭连接的操作放在异步流程的最后,确保查询完成后再执行。

2. Promise链处理错误

  • 你手动替换了sql.Promise = require('promise');,但mssql本身已经支持原生Promise(或兼容的Promise实现),没必要手动替换,这可能导致Promise链异常。
  • 第一个then块最后返回的是request对象,而不是request.execute()返回的Promise,这会让后续then无法拿到查询结果。应该返回request.execute("storedprocedure")的Promise。

3. 其他优化建议

  • 把require("mssql")放在函数外部,避免每次调用都重新加载模块。
  • 格式化代码,提升可读性,方便后续调试。

修复后的完整代码

const sql = require("mssql");

// mssql原生支持Promise,无需手动替换
// sql.Promise = require('promise'); 

const runProc = function(params) {
  return new Promise((resolve, reject) => {
    const dbConfig = {
      server: "ip",
      database: "db",
      user: "user",
      password: "pw"
    };

    console.log("got to the run proc functions");
    const keys = Object.keys(params);

    sql.connect(dbConfig)
      .then(pool => {
        console.log("got connected");
        const request = pool.request();

        for (let i = 0; i < keys.length; i++) {
          const key = keys[i];
          if (key.substring(0, 6) === "Common") {
            request.input(key, sql.Bit, params[key]);
            console.log("set the bit parameters");
          } else {
            request.input(key, params[key]);
            console.log("set the other parameters");
          }
        }

        // 返回execute的Promise,让后续then能拿到查询结果
        return request.execute("storedprocedure");
      })
      .then(result => {
        resolve(result);
      })
      .catch(err => {
        reject(new Error(err));
      })
      .finally(() => {
        // 无论成功失败,最后统一关闭连接
        sql.close();
      });
  });
};

简化版代码(更推荐)

如果你的mssql版本较新,其实可以不用手动包裹一层Promise,直接返回整个Promise链,代码更简洁:

const sql = require("mssql");

const runProc = function(params) {
  const dbConfig = {
    server: "ip",
    database: "db",
    user: "user",
    password: "pw"
  };

  console.log("got to the run proc functions");
  const keys = Object.keys(params);

  return sql.connect(dbConfig)
    .then(pool => {
      console.log("got connected");
      const request = pool.request();

      for (const key of keys) {
        if (key.startsWith("Common")) {
          request.input(key, sql.Bit, params[key]);
          console.log("set the bit parameters");
        } else {
          request.input(key, params[key]);
          console.log("set the other parameters");
        }
      }

      return request.execute("storedprocedure");
    })
    .then(result => {
      sql.close();
      return result;
    })
    .catch(err => {
      sql.close();
      throw new Error(err);
    });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:55