Node.js使用mssql连接SQL Server超时问题求助
解决Node.js mssql连接超时问题
针对你遇到的两个同配置项目一个连接SQL Server超时的问题,以下是具体排查和修复方案:
1. 验证环境变量的准确性
虽然你提到用了相同凭证,但务必确认出问题的项目中环境变量的实际值是否正确:
- 检查
DB_PORT是否为数字类型(mssql要求port是number,若为字符串会导致连接失败) - 在创建连接池前添加日志打印配置,对比正常项目的输出:
console.log('实际SQL配置:', JSON.stringify(sqlConfig, null, 2)); const pool = new sql.ConnectionPool(sqlConfig);
2. 延长连接超时时间
默认15000ms的超时可能不足以应对当前项目的网络环境,在sqlConfig的options中增加超时设置:
const sqlConfig = { // ...原有配置 options: { trustServerCertificate: true, connectTimeout: 30000 // 延长至30秒 }, };
3. 修复未处理的Promise拒绝
报错中的未捕获Promise拒绝会掩盖真实错误,且可能导致进程异常,完善错误处理逻辑:
// 连接池连接时捕获错误 const poolConnect = pool.connect().catch(err => { console.error('连接池初始化失败:', err); throw err; }); // 查询方法添加错误捕获 export const runQuery = async (query: string) => { try { await poolConnect; const request = pool.request(); const result = await request.query(query); return result?.recordset || []; } catch (err) { console.error('查询执行失败:', err); throw err; // 或根据业务需求处理错误 } };
4. 统一Tedious依赖版本
mssql依赖tedious驱动,即使mssql版本一致,不同项目可能因为lockfile差异安装了不同版本的tedious:
- 对比两个项目中
node_modules/tedious/package.json的版本号 - 在出问题的项目
package.json中锁定tedious版本(使用正常项目的版本):
"resolutions": { "tedious": "11.0.0" // 替换为正常项目的tedious版本 }
执行npm install重新安装依赖。
5. 增强连接池错误监听
当前的错误监听仅打印日志,可优化为更严谨的处理逻辑,避免连接池异常导致后续失败:
pool.on("error", (err) => { console.error('连接池错误:', err); // 可选:根据业务场景添加重新连接逻辑 });
6. 排查网络连通性
若以上方案无效,需确认项目所在服务器与SQL Server的网络连通性:
# 使用telnet测试端口 telnet your-server-ip your-db-port # 或用nc工具 nc -zv your-server-ip your-db-port
若连接失败,说明是防火墙、安全组或路由配置问题,需排查网络策略。
内容的提问来源于stack exchange,提问作者fcorseb
相关产品推荐
相关产品推荐

