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
相关产品推荐
相关产品推荐

