使用node-mssql构建REST API时遇length未定义错误求助
解决mssql库连接AD域SQL Server时的NTLM TypeError问题
看起来你遇到的问题是mssql封装tedious时在NTLM认证阶段的参数传递bug——直接用tedious能正常连接,但通过mssql就触发了server_data未定义的TypeError。结合你的代码和错误信息,我整理了几个针对性的解决方案:
1. 先修正mssql的配置结构
mssql的配置字段和原生tedious有差异,你之前的配置里存在字段名称和位置错误,这是导致参数传递异常的核心原因之一。调整后的配置如下:
const sql = require('mssql'); const express = require('express') const app = express() // 确保serversIP变量已正确定义 const serversIP = '你的服务器实际IP'; var config = { user: 'user', // 注意mssql用user而非userName password: 'pass', server: serversIP, database: 'test', port: 2222, debug: true, driver: 'tedious', options: { instanceName: "instance", domain: "AD", // domain必须放在options内 encrypt: false, // 内部AD环境通常不需要加密 trustServerCertificate: true // 若使用自签证书需开启 } }
2. 修复API路由中的代码错误
你的路由代码里存在两个明显的bug,会导致连接逻辑异常:
- 误用了
req.query而非request.query - 引用了未定义的
conn变量
改用async/await语法重构后的代码更清晰且不易出错:
app.get("/getUsers", async (req, res) => { try { // 建立数据库连接 await sql.connect(config); const request = new sql.Request(); // 执行查询 const recordset = await request.query("SELECT * FROM test"); console.log(recordset); res.json(recordset); } catch (err) { console.error(err); res.status(500).send('数据库查询失败'); } finally { // 确保连接关闭 await sql.close(); } });
3. 升级依赖版本
老版本的mssql和tedious存在NTLM认证的已知bug,建议直接升级到最新稳定版:
npm update mssql tedious
4. 明确指定NTLM认证方式(可选)
如果上述方案仍无效,可以在配置里显式指定认证类型,强制mssql正确传递NTLM参数给tedious:
options: { // 其他配置... authentication: { type: 'ntlm', options: { domain: "AD", userName: 'user', password: 'pass' } } }
为什么直接用tedious正常?
因为tedious的原生配置结构和mssql的封装层要求不同,你直接写的tedious配置符合它的参数预期,但mssql作为中间层,对字段名称、层级有自己的规则,之前的配置不匹配导致认证时缺少了server_data等必要参数,最终触发了TypeError。
内容的提问来源于stack exchange,提问作者Vladimir Zaguzin
相关产品推荐
相关产品推荐

