You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:02