【问题标题】:Cannot connect to SQL Server with Node.js and Tedious无法使用 Node.js 和繁琐的连接到 SQL Server
【发布时间】:2015-11-25 18:11:15
【问题描述】:

当我尝试使用 Node.js 和 Tedioius 连接到本地 SQL Server 实例时,我收到此错误:

{ [ConnectionError: Failed to connect to XXXXX:1433 - connect ECONNREFUSED]
  name: 'ConnectionError',
  message: 'Failed to connect to XXXXX:1433 - connect ECONNREFUSED',
  code: 'ESOCKET' }

这是我的连接对象:

var config = {
  userName: 'username',
  password: 'password',
  server: 'XXXXX',

  options: {
    database: 'databasename',
    instancename: 'SQLEXPRESS'
  }
};

根据配置管理器,我已检查并启用 TCP/IP 并在端口 1443 上广播。 SQL Server Browser 服务也在运行,如果不是,我读到的可能会导致此类问题。我禁用了我的防病毒软件和防火墙,但也没有用。

有什么见解吗?

【问题讨论】:

    标签: javascript sql-server node.js tcp tedious


    【解决方案1】:

    所以我猜想发生的是,即使 Tedious 允许您在“选项”中包含实例名称,它要么不使用它,要么在需要使用时无法使用它。在做了一些研究之后,应该发生的事情是当您为 SQL Server 提供实例名称时,它会将您从端口 1433 重定向到它用于该实例的动态端口。我不知道它使用的是动态端口,但如果您的实例被命名,则端口将始终是动态的。我不知道我在哪里看到它在 1433 广播,那是我的错误。

    要检查动态端口,请看这里:

    根据这些信息,我将代码更改为:

    var config = {
      userName: 'username',
      password: 'password',
      server: 'XXXXX',
    
      options: {
        port: 49175,
        database: 'databasename',
        instancename: 'SQLEXPRESS'
      }
    };
    

    现在一切都很好,希望这对某人有所帮助。

    【讨论】:

    • 我发现instanceName的大写很重要(需要大写N)
    • 我只需要更改端口并忽略实例名称。这是残酷的,这在 Sequelize 或 Tedious 的任何文档中都没有!
    • 帮我解决了!但是,端口号后面缺少逗号。
    • 使用繁琐的 v6.4.0(可能更早),您可以指定端口或实例名称,但不能同时指定两者。
    【解决方案2】:

    如果其他人像我一样是 SQL Server 新手,并且正在处理此问题,请按照以下步骤在 SQL Server 配置管理器中启用 TCP/IP:

    > SQL Server 网络配置

    > YOURSQLSERVERINSTANCE 的协议

    > TCP/IP

    > 启用

    您会收到如下所示的警告消息:

    所做的任何更改都将被保存;但是,在服务停止并重新启动之前,它们不会生效。

    我认为这是在 SQL Server Management Studio 中断开与数据库服务的连接并重新连接,但这需要在 SQL Server 服务选项卡下的 SQL Server 配置管理器中进行。找到你的 SQL Server 实例,停止并重新启动它,希望你会成功!这对我来说就像一个魅力。奇怪的是,启用命名管道协议似乎无需重新启动就可以工作(我可以看到错误消息中的差异),所以我确信它已经停止并根据需要重新启动。

    另外,一定要enable SQL Server Browser services。这和启用 TCP/IP 并重新启动服务是我的关键。

    【讨论】:

    • 帮了我!谢谢!
    【解决方案3】:

    如果启用 TCP/IP 协议后仍有问题,建议您检查 SQL Server Browser 服务是否正在运行。就我而言,我花了很多时间才意识到它没有运行。

    这个配置对我来说运行良好:

     var config = {
         user: 'user',
         password: 'userPwd',
         server: 'localhost',
         database: 'myDatabase',
         options: {
             truestedConnection: true,
             instanceName: 'SQLEXPRESS'
        }
    

    【讨论】:

      【解决方案4】:

      如果您仍然收到此错误,

      "...'连接服务器失败:1433 - 连接ECONNREFUSED服务器IP:1433', 代码:'ESOCKET' }"

      并且您已经检查了以下所有内容:

      1. 启用 TCP/IP
      2. 打开 1433 端口
      3. 正确配置设置(数据库、服务器、用户名和密码}
      4. 未配置动态端口

      检查您的 SQL 服务器版本。就我而言,我发现我可以使用相同的代码连接到 SQL 2012,但不能连接到 SQL server 2016。繁琐的驱动程序似乎还不支持 SQL Server 2016。

      【讨论】:

      • 我很高兴我还没有使用 sql server 2016...我在 sql server 2014 上,由于某种原因,我的 TCP/IP 未启用,原因是 sql server 2014 安装什么都没有连接到。 Visual Studio ado.net 向导在禁用 tcp/ip 的情况下连接得很好
      【解决方案5】:

      ... 您必须在 MSSQLSERVER 的协议上启用 tcp/ip

      并激活两个身份验证

      【讨论】:

        【解决方案6】:

        这是完整的代码

        const {
            Request
        } = require('tedious');
        
        var Connection = require('tedious').Connection;
        var config = {
            server: 'DESKTOP-RU9C12L', //update me
            authentication: {
                type: 'default',
                options: {
                    userName: 'begaak', //update me
                    password: 'begaak@123', //update me
                }
            },
            options: {
                encrypt: true,
                enableArithAbort: true,
                integratedSecurity: true,
                trustServerCertificate: true,
                rowCollectionOnDone: true,
                database: 'selvapoc' //update me
            }
        };
        
        
        var connection = new Connection(config);
        
        
        connection.connect(function(err) {
            console.log('testing')
                // var request = new Request("Select * from products", function(err, rowCount, rows) {
                //     console.log(rowCount);
                //     console.log(JSON.stringify(rows))
                // });
                // connection.execSql(request);
        
            connection.execSql(new Request('SELECT * FROM Products', function(err, rowCount, rows) {
                    if (err) {
                        throw err;
                    }
                })
                .on('doneInProc', function(rowCount, more, rows) {
                    console.log(more, rows[0], rowCount); // not empty
                }));
        
        });
        connection.on('connect', function(err) {
            // If no error, then good to proceed.  
            if (err) console.log(err)
            console.log("Connected");
        });
        

        在开始代码之前使用 SQL SERVER CONFIGURATION MANAGER 配置这些

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-10
          • 2019-09-02
          • 1970-01-01
          • 2019-10-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多