Node.js连接MSSQL对接Magento遇状态错误请求失败求助
解决Node.js连接MSSQL时的"Requests can only be made in the LoggedIn state"错误
看起来你遇到的问题核心是连接并未成功建立,但你依然尝试执行SQL查询——从错误栈里的socketError能看出来,你的连接过程中出现了网络或配置相关的错误,但你的代码没有处理这些错误,直接在connect事件里执行了executeStatement(),此时连接处于Connecting而非LoggedIn状态,所以触发了这个错误。
问题出在这几处:
- 没有处理
connect事件的err参数:当连接失败时,err会有值,但你直接忽略了它,依然执行查询 - 没有监听连接的
error事件:无法捕获连接过程中的底层错误(比如socket连接失败、认证错误) request变量是全局的:可能引发意外的变量污染
修改后的代码:
var Connection = require('tedious').Connection; var Request = require('tedious').Request; var TYPES = require('tedious').TYPES; var config = { userName: 'Cool userName', password: 'awesome password', server: 'amazing server', options: { database: 'database', } }; var connection = new Connection(config); // 监听连接错误事件,捕获底层问题 connection.on('error', function(err) { console.error('连接过程中发生错误:', err); }); connection.on('connect', function(err) { // 先检查连接是否成功 if (err) { console.error('连接失败:', err); return; } console.log("Connected"); executeStatement(); }); function executeStatement() { // 把request声明为局部变量,避免全局污染 const request = new Request("select * from Artikelstamm;", function(err) { if (err) { console.error('查询执行错误:', err); } }); let result = ""; request.on('row', function(columns) { columns.forEach(function(column) { if (column.value === null) { console.log('NULL'); } else { result += column.value + " "; } }); console.log(result); result =""; }); request.on('done', function(rowCount, more) { console.log(rowCount + ' rows returned'); }); connection.execSql(request); }
关键修改说明:
- 处理
connect事件的错误:在connect回调里先判断err,只有连接成功(err为null)才执行查询,否则打印错误信息 - 添加
error事件监听:可以捕获连接过程中的底层错误,比如服务器不可达、账号密码错误、SSL配置问题等,这能帮你定位真正的连接失败原因 - 将
request改为局部变量:使用const声明,避免全局变量带来的意外问题 - 优化错误日志:把
console.log改为console.error区分错误信息,便于排查
额外排查建议:
- 确认你的
server地址、userName、password、database配置完全正确 - 检查你的Node.js服务器是否能访问MSSQL服务器的端口(默认1433),可能需要开放防火墙
- 如果是远程MSSQL服务器,确认是否开启了远程连接权限,以及SQL Server的身份验证模式是否为混合模式(如果使用SQL账号的话)
内容的提问来源于stack exchange,提问作者dasKamel
相关产品推荐
相关产品推荐

