Node.js连接SQL Server数据库失败问题求助
嘿,作为新手遇到这种数据库连接问题太正常了,我帮你拆解一下这些错误的含义,再给你一步步的解决办法:
你的代码
var express = require('express'); var app = express(); var sql = require("mssql"); app.get('/', function (req, res) { // config for your database var config = { user: 'superadmin', password: '***', server: 'localhost', database: 'XXX' }; // connect to your database sql.connect(config, function (err) { if (err) console.log(err); // create Request object var request = new sql.Request(); // query to the database and get the records request.query('select * from Schools', function (err, recordset) { if (err) console.log(err) // send records as a response res.send(recordset); }); }); }); var server = app.listen(5000, function () { console.log('Server is running..'); });
错误含义拆解
1. Tedious库警告
tedious deprecated The default value for
options.encryptwill change fromfalsetotrue. Please passfalseexplicitly if you want to retain current behaviour.
这只是个警告不是错误:mssql依赖的tedious库未来版本会把加密连接的默认值从false改成true,如果你是本地测试环境不需要加密连接,得显式在配置里声明encrypt: false来保持当前行为。
2. 核心连接失败错误
{ ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) ... code: 'ESOCKET', originalError: { message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }, name: 'ConnectionError' }
这是最关键的问题:你的Node.js程序连不上本地1433端口的SQL Server实例。常见原因包括:
- SQL Server服务根本没启动
- SQL Server默认关闭了TCP/IP协议
- 1433端口被防火墙拦截
superadmin账号密码错误,或者没有访问XXX数据库的权限- 数据库名称
XXX拼写错误
3. 连锁错误
{ ConnectionError: Connection is closed. ... code: 'ECONNCLOSED', name: 'ConnectionError' }
这个是前面连接失败的连锁反应:因为数据库连接没建立成功,你后面尝试执行request.query时,连接已经处于关闭状态,所以报这个错。只要解决了第一个连接问题,这个错误会自动消失。
一步步解决问题
步骤1:确认SQL Server服务在运行
按下Win+R输入services.msc打开服务管理器,找到SQL Server (MSSQLSERVER)(如果是自定义实例,名称会是SQL Server(你的实例名)),确保它的状态是正在运行,没运行的话右键启动它。
步骤2:启用SQL Server的TCP/IP协议
- 打开
SQL Server配置管理器(开始菜单搜索就能找到) - 展开
SQL Server网络配置,点击MSSQLSERVER的协议(对应你的实例) - 右键
TCP/IP选择启用 - 再右键
TCP/IP选属性,切换到IP地址选项卡,拉到最下面的IPALL部分,确认TCP端口是1433(如果改了其他端口,代码里的server要写成localhost,端口号) - 回到服务管理器,重启
SQL Server服务让配置生效
步骤3:完善代码连接配置
给你的config对象加上options属性,消除警告同时确保参数正确:
var config = { user: 'superadmin', password: '***', server: 'localhost', database: 'XXX', options: { encrypt: false // 本地环境不需要加密,消除警告 } };
步骤4:检查防火墙设置
临时关闭Windows防火墙测试,如果能连上,说明是防火墙拦截了1433端口,需要在防火墙里添加允许1433端口入站的规则。
步骤5:验证账号权限
打开SQL Server Management Studio,用superadmin账号登录,确认能访问XXX数据库,并且有权限查询Schools表。
内容的提问来源于stack exchange,提问作者Michael

