Не удается подключиться к SQL Server с Node.js и Tedious

Когда я пытаюсь использовать 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 в соответствии с Configuration Manager. Служба обозревателя SQL Server также работает, что, как я прочитал, может вызывать проблемы такого типа, если нет. Я отключил свой антивирус и брандмауэр, и это тоже не помогло.

Любое понимание?

7 ответов

Решение

Так что я предполагаю, что случается так, что, хотя Tedious позволяет вам включать имя экземпляра в 'options', он либо не использует его, либо не может использовать его по мере необходимости. После некоторых исследований, когда вы даете SQL Server имя экземпляра, он перенаправляет вас с порта 1433 на динамический порт, который он использует для этого экземпляра. Я не знал, что он использует динамический порт, но если ваш экземпляр назван, порт всегда будет динамическим. Я не знаю, где я видел это в 1433 году, это была моя ошибка.

Чтобы проверить динамический порт, посмотрите здесь:

Исходя из этой информации, я изменил свой код на это:

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

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

Теперь все хорошо, надеюсь, это кому-нибудь поможет.

Если кто-то еще не знаком с SQL Server, как я, и имеет дело с этой проблемой, после включения TCP/IP в диспетчере конфигурации SQL Server, выполнив следующие действия:

> Конфигурация сети SQL Server

> Протоколы для ВАШЕЙ СЕРВЕРИНСТАНЦИИ

> TCP/IP

> Включить

вы получите предупреждение, которое выглядит так:

Любые сделанные изменения будут сохранены; однако они не вступят в силу, пока служба не будет остановлена ​​и перезапущена.

Я понял это как отключение от службы базы данных в SQL Server Management Studio и повторное подключение, но это должно происходить в диспетчере конфигурации SQL Server на вкладке "Службы SQL Server". Найдите свой экземпляр SQL Server, остановите и перезапустите его, и, надеюсь, вы будете золотым! Это сработало как обаяние для меня. Как ни странно, включение протокола Named Pipes, казалось, работало без перезапуска (я мог видеть разницу в сообщении об ошибке), поэтому я подумал наверняка, что он остановился и перезапустился по мере необходимости.

Также обязательно включите службы браузера SQL Server. Это и включение TCP/IP и перезапуск службы были ключами для меня.

Если вы все еще получили эту ошибку,

"... 'Не удалось подключиться к серверу:1433 - подключить ECONNREFUSED IP-адрес сервера:1433', код: 'ESOCKET'}"

и вы проверили все следующее:

  1. Включить TCP/IP
  2. Открытый порт 1433
  3. Настройка конфигурации правильно (база данных, сервер, имя пользователя и пароль}
  4. Динамические порты не настроены

Проверьте версию своего сервера SQL. В моем случае я обнаружил, что могу подключиться к SQL 2012, но не к SQL Server 2016 с тем же кодом. Похоже, что SQL Server 2016 еще не поддерживается утомительным драйвером.

Если после включения протокола TCP/IP у вас все еще есть проблемы, я бы посоветовал вам проверить, запущена ли служба браузера SQL Server. В моем случае я провел много времени, пока не понял, что это не работает.

Эта конфигурация работает нормально для меня:

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

... Вы должны включить tcp/ip в протоколе для MSSQLSERVER

и активируйте обе аутентификации

Вот полный код

       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

Недавно я столкнулся с этой проблемой, я пытался подключить MSSQL, который размещен на удаленном сервере. Конфигурация, которую мне пришлось использовать, -

       let config = {
    user: 'user',
    password: 'password',
    server: 'server',
    database: 'database',
    "options":{
        instanceName: 'instanceName',
        "encrypt":true,
        "enableArithAbort":true,
        "trustServerCertificate": true,
       }
}; 
module.exports=config;

Для получения имени экземпляра используйте SELECT @@ servicename в SSMS.

Другие вопросы по тегам