使用node-mssql连接MSSQL失败:'Labo'登录失败ELOGIN问题
解决node-mssql连接SQL Server时的"Login failed for user 'Labo'"问题
首先可以明确:这个大小写差异大概率不是node-mssql的bug,更可能是SQL Server端的配置或代码里的连接参数冲突导致的,下面一步步帮你排查:
1. 检查SQL Server的身份验证模式
如果你的SQL Server实例设置为仅Windows身份验证,那么用SQL账号(比如labo)登录肯定会失败。你可以打开SQL Server Management Studio(SSMS),右键实例→属性→安全性,确认选中的是SQL Server和Windows身份验证模式,如果不是,修改后重启SQL Server服务。
2. 确认登录名的大小写与存在性
SQL Server的登录名是否区分大小写,取决于实例的排序规则(比如SQL_Latin1_General_CP1_CS_AS是区分大小写的,_CI_AS则不区分)。你可以在SSMS里展开实例→安全性→登录名,看看实际存在的是labo还是Labo:
- 如果服务器端是
Labo,而你代码里用小写labo,当排序规则区分大小写时,就会触发登录失败,报错里显示的是服务器端实际存在的登录名。 - 如果服务器端两者都不存在,那你需要先创建对应的SQL登录名,并赋予访问
DATA数据库的权限。
3. 修复连接参数的冲突
你的代码里同时指定了port: 1433和dialectOptions.instanceName: "SQLEXPRESS",这会导致冲突:
- 默认情况下,SQL Server Express实例(SQLEXPRESS)使用的是动态端口,不是固定的1433(1433是默认实例的端口)。
- 你要么移除
port参数,让node-mssql通过实例名自动发现端口;要么在SQL Server配置管理器里找到SQLEXPRESS的TCP/IP端口,把代码里的port改成对应的数值,同时移除instanceName参数。
修改后的配置示例(二选一):
方式一:用实例名自动找端口
const sql = require("mssql"); var sqlconfig = { server:"192.168.200.5", database:"DATA", user: "labo", // 或者改成服务器端实际的"Labo" password: "*********", connectionTimeout: 30000, dialect: "mssql", dialectOptions: { "instanceName": "SQLEXPRESS" }, };
方式二:指定正确的端口
const sql = require("mssql"); var sqlconfig = { server:"192.168.200.5", database:"DATA", user: "labo", // 或者改成服务器端实际的"Labo" password: "*********", connectionTimeout: 30000, port: 1434, // 替换成SQLEXPRESS实际的TCP端口 dialect: "mssql", };
4. 验证账号权限与密码
- 确认
labo(或Labo)账号已启用:在SSMS里右键登录名→属性→状态,确认"登录"选项是"启用"。 - 确认账号有权限访问
DATA数据库:右键登录名→属性→用户映射,勾选DATA数据库,并赋予对应的角色(比如db_datareader)。 - 仔细核对密码:SQL Server的密码是区分大小写的,确保代码里的密码和服务器端设置的完全一致。
关于报错里的"Labo"
报错信息里显示的用户名是服务器端返回的,通常是因为你代码里的用户名与服务器端实际存在的登录名不匹配(比如大小写),或者连接到了错误的实例(那里存在Labo账号),这不是node-mssql的bug,而是服务器端的验证反馈。
内容的提问来源于stack exchange,提问作者T.Dong
相关产品推荐
相关产品推荐

