Node.js MSSQL tedius ConnectionError:无法连接到localhost:1433 - 连接ECONNREFUSED

时间:2014-08-29 22:50:50

标签: sql-server node.js node-mssql tedious

我正在尝试使用带有mssql连接接口的NodeJS连接到MSSQL 2012。

尝试连接时出现以下错误:

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

有关如何解决此问题的任何想法?

11 个答案:

答案 0 :(得分:83)

解决方案是启用默认禁用的TCP连接。

enter image description here

答案 1 :(得分:18)

我的情况与马特的​​情况完全不一样,但他的截图足以让我记住遗漏的东西。

enter image description here

正如here所述,当您使用SQL Server实例名称连接到它时,您必须运行SQL Server Browser。

  

options.instanceName       要连接的实例名称。 SQL Server Browser服务必须在数据库服务器上运行,并且必须可以访问数据库服务器上的UDP端口1444。       (没有默认值)       与options.port互斥。

答案 2 :(得分:10)

如果启用TCP连接后仍然无法正常配置。这是我自己的配置。

var config = {
    "user": 'admin',
    "password": 'password',
    "server": 'ALBERT-PC',
    "database": 'database_name',
    "port": '61427',
    "dialect": "mssql",
    "dialectOptions": {
        "instanceName": "SQLEXPRESS"
    }
};

答案 3 :(得分:5)

最佳做法是首先使用查询分析器(SQL Management Studio(Windows)或SQLPro for MSSQL(Mac))使用与您希望通过应用程序使用的相同协议,端口和凭据验证与SQL Server的连接

在Management Studio中,格式为Server,Port(例如192.168.1.10,1433);你可能会使用SQL Server身份验证而不是Windows身份验证。

配置SQL Server的步骤:

如果您打算使用SQL Server身份验证,请使用混合身份验证进行安装。

设置SQL Server以在固定端口号上侦听TCP:

  • SQL Configuration Manager SQL Server网络配置
    • {Instance}的协议
      • TCP / IP - 已启用 (双击)
      • IP地址(在所有需要的接口上)
        • TCP动态端口= BLANK! (不是零)
        • TCP端口 - 1433(或所需端口)

答案 4 :(得分:3)

**Please follow the connection configuration and little test:**

//Declare global variable
var http = require('http');
var events = require('events');
var nodemailer = require('nodemailer');
var sql = require('mssql');<br/>
var Request = require('tedious').Request;  
var TYPES = require('tedious').TYPES; 
//Create an http server
http.createServer(function(req,res)
{
res.writeHead(200, {'Content-Type': 'text/html'});
 var Connection = require('tedious').Connection; 
//Configure the connection 
    var config = {  
        userName: '<user id>',  
        password: '<password>',  
        server: '<system ip>',  
        options: {database: '<database name>'}  
    };  
    var connection = new Connection(config);  
    connection.on('connect', function(err) {  
        console.log("Connected"); 
        executeStatement();     
    }); 

function executeStatement() {  
        request = new Request("select getdate();", function(err) {  
        if (err) {  
            console.log(err);}  
        });
     var 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 ="";  
        });  

        connection.execSql(request);  
};
  return res.end();
}).listen(8080);

//在浏览器上发布配置测试: http://localhost:8080/

答案 5 :(得分:3)

如果尽管提出了所有建议,仍然有人仍在努力保持联系。
就我而言,我必须在SQL Server网络配置->协议...-> TCP / IP-> IP地址-> IPAll中手动将TCP端口属性设置为1433。

[1]

答案 6 :(得分:2)

在我的情况下,出现配置问题。这是错误的配置

let config = {
server: 'localhost',
authentication: {
    type: 'default',
    options: {
        userName: 'sa', // update me
        password: 'xxxxx' // update me
    }
},
options: {
    database: 'SampleDB',
    validateBulkLoadParameters:false,
}}

然后我在选项中添加了加密变量。它解决了我的问题。正确的配置

let config = {
server: 'localhost',
authentication: {
    type: 'default',
    options: {
        userName: 'sa', // update me
        password: 'xxxxxx' // update me
    }
},
options: {
    database: 'SampleDB',
    validateBulkLoadParameters:false,
    encrypt: false,
}

}

答案 7 :(得分:1)

我无法连接'localhost',尽管我在SQL Management Studio和其他应用程序中使用'localhost'。 当我使用计算机名称(网络地址)时,它工作正常!

答案 8 :(得分:1)

除了将TCP端口号设置为1433。 如果出现“连接丢失-流被破坏后无法调用写入”错误

如果您使用options.encrypt:在具有旧版SQL Server版本的Node v12 +上为true,也会发生此错误。

这是由节点v12需要TLS 1.2引起的。

  • 为您的SQL Server安装TLS 1.2安全补丁
  • 具有向后兼容性标志的运行节点:

    <form action="../php/login.php" method="post"> <input id = "loginButton" type="image" src ="../images/loginAndRegister.gif" alt="submit"> <div class = "panel"> <p> Login </p> <br> <br> <label> username </label> <br> <input type = "text" name = "username" required> <br> <label> password </label> <br> <input type = "password" name = "password" required> <br> <p id = "wrongLogin"> Incorrect username or password </p> </div> </form>

    例如:node --tls-min-v1.0

  • 通过设置

    禁用加密通信

    node --tls-min-v1.0 app.js(可选)

配置对象:

options.encrypt: false

参考: https://github.com/tediousjs/tedious/issues/903#issuecomment-614597523

答案 9 :(得分:0)

我的问题是我需要首先使用此命令在Mac上使用docker启动sqlserver

sudo docker start sqlserver

答案 10 :(得分:0)

对我来说,将此条件从“否”更改为“是”有效:

    switch (key) {
      case 'instance':
        return this.config.options.instanceName
      case 'trusted':
        return this.config.options.trustedConnection ? 'Yes' : 'Yes'

即使我提供它,它也不会从选项对象加载值。

我在文件 \node_modules\mssql\lib\msnodesqlv8\connection-pool.js

中硬编码了这个更改