You need to enable JavaScript to run this app. Node.js使用mssql库出现this.parent.acquire is not a function报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用mssql库出现this.parent.acquire is not a function报错如何解决

错误根因
  • sql.connect(config)返回的是Promise对象,而非已就绪的连接池实例,你直接将未resolve的Promise传入sql.Transaction构造函数,导致事务无法从父对象获取可用连接,触发对应报错。
  • 代码时序逻辑错误:不等数据库操作完成就直接执行res.sendFile返回响应,也没有对事务异常做回滚处理。
修复方案

推荐用async/await写法改写,保证异步流程顺序执行:

// 建议把连接池初始化放到全局,不要每次请求都新建连接
let globalPool = null;
const initPool = async () => {
  const config = {
    server: 'server',  //update me
    user: 'user', //update me
    password: 'pass',  //update me
    database: 'db',
    trustServerCertificate: true
  }
  globalPool = await sql.connect(config);
}
// 服务启动时先初始化连接池
initPool();

app.post("/add", async (req,res) => {
  const transaction = new sql.Transaction(globalPool)
  try {
    // 开启事务
    await transaction.begin()
    const request = new sql.Request(transaction)
    await request.query('insert into fsraSample (A93) values (12345)')
    // 提交事务
    await transaction.commit()
    console.log("Transaction committed.")
  } catch(err) {
    // 出错回滚事务
    await transaction.rollback()
    console.log('操作出错', err);
  } finally {
    res.sendFile(path.join(__dirname + '/index.html'));
  }
});
额外优化建议
  • 全局复用连接池,避免每次请求都新建数据库连接,降低性能损耗和连接耗尽风险。
  • 所有数据库异步操作都要等待执行完成后再处理响应逻辑,避免时序异常。
  • 事务执行报错时必须触发回滚,保证数据一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:06:05