Linux环境下使用node-mssql连接MSSQL数据库失败求助
问题概述
本地Windows机器使用node-mssql连接MSSQL 2019数据库正常,但部署到Linux服务器后连接失败,报错涉及crypto模块的Hmac错误。升级NodeJS和node-mssql版本后出现该问题,旧版本(NodeJS 16.15.0 + node-mssql 4.3.7)可正常连接。
报错信息
src/node_modules/tedious/lib/connection.js: 2423
throw errError: error:00000000 : lib(0):func(0):reason(0)
at new Hmac(node:internal/crypto/hash:136:17)
at Object.createHmac (node:crypto:165:10)
当前配置信息
const sqlConfig = { user: process.env.DB_USER, password: process.env.DB_PWD, database: process.env.DB_NAME, domain: process.env.Domain, server: process.env.server, port: process.env.port, // 原配置缺失逗号,需修正语法错误 pool: { max: 10, min: 0, idleTimeoutMillis: 30000 }, options: { encrypt: true, // for azure trustServerCertificate: true // change to true for local dev / self-signed certs } } async () => { try { await sql.connect(sqlConfig) const result = await sql.query`select * from mytable where id = ${value}` console.log(result) } catch (err) { console.log(err) // 原代码错误使用未定义变量error,需改为err } }
软件版本对比
- 当前故障环境版本:
- NodeJS: 18.17.1
- node-mssql: 10.0.2
- SQL Server: 2019
- 原正常工作版本:
- NodeJS: 16.15.0
- node-mssql: 4.3.7
- SQL Server: 2019
解决方向
1. 修复配置语法错误
先修正配置中的两处明显错误:
port: process.env.port后添加逗号,保证对象结构合法- catch块中
console.log(error)改为console.log(err),避免未定义变量报错
2. 检查Linux环境OpenSSL版本
NodeJS 18.x依赖较新版本的OpenSSL,部分Linux发行版自带版本可能不兼容。执行以下命令查看版本:
openssl version
若版本低于1.1.1,建议升级OpenSSL到1.1.1及以上版本。
3. 调整加密与NTLM认证配置
由于使用域账号(配置含domain字段),尝试修改options配置:
options: { encrypt: true, trustServerCertificate: true, ntlmV2: true // 强制使用NTLMv2认证,适配Linux环境 }
若数据库服务器无需加密连接,可尝试将encrypt设为false测试。
4. 验证环境变量加载
Linux环境变量加载逻辑与Windows不同,确保DB_USER、DB_PWD、Domain等变量正确设置且可被NodeJS读取。可在代码开头添加日志验证:
console.log("加载的数据库配置:", { user: process.env.DB_USER, server: process.env.server, port: process.env.port, domain: process.env.Domain });
5. 检查网络连通性
确认Linux服务器能访问MSSQL服务器端口(默认1433),执行以下命令测试:
telnet <数据库服务器IP> <端口> # 或使用nc命令 nc -zv <数据库服务器IP> <端口>
若不通,检查Linux服务器防火墙、数据库服务器防火墙及网络路由规则。
内容的提问来源于stack exchange,提问作者Aditya yadav

