Поделиться через


Шаг 3. Доказательство концепции подключения к SQL с помощью Node.js

Скачать драйвер SQL для Node.js

Этот пример следует рассматривать только как подтверждение концепции. Пример кода упрощен для ясности и не обязательно представляет рекомендации, рекомендуемые корпорацией Майкрософт. Другие примеры, которые используют те же важные функции, доступны в примере репозитория GitHub.

Необходимые условия

Перед запуском примера кода убедитесь, что выполнены следующие предварительные требования:

  • Node.js устанавливается на компьютере разработки. Скачайте его из nodejs.org.
  • Установлен мучливый пакет npm. Запустите npm install tedious в каталоге проекта.
  • Экземпляр SQL Server доступен и настроен для приема подключений:
    • Протокол TCP/IP включен в диспетчере конфигурации SQL Server. TCP/IP по умолчанию отключен в выпусках SQL Server Express.
    • Служба браузера SQL Server запущена при подключении к именованному экземпляру.
    • Брандмауэр разрешает подключения к порту SQL Server (по умолчанию: 1433).
    • Для проверки подлинности SQL Server разрешен вход SQL, а SQL Server настроен для проверки подлинности в смешанном режиме.

Подсказка

Если возникает ошибка подключения, например Failed to connect, убедитесь, что tcp/IP включен и запущена служба SQL Server. Для локальной разработки попробуйте подключиться с помощью server: 'localhost' или server: '127.0.0.1'.

Шаг 1. Подключение

Используйте новую функцию подключения для подключения к базе данных SQL.

    var Connection = require('tedious').Connection;  
    var config = {  
        server: 'your_server.database.windows.net',  //update me
        authentication: {
            type: 'default',
            options: {
                userName: 'your_username', //update me
                password: 'your_password'  //update me
            }
        },
        options: {
            // If you're on Microsoft Azure, you need encryption:
            encrypt: true,
            database: 'your_database'  //update me
        }
    };  
    var connection = new Connection(config);  
    connection.on('connect', function(err) {  
        // If no error, then good to proceed.
        console.log("Connected");  
    });
    
    connection.connect();

Шаг 2. Выполнение запроса

Выполните все инструкции SQL с помощью новой функции request . Если инструкция возвращает строки, например инструкцию select, вы можете получить их с помощью функции request.on . Если строк нет, функция request.on возвращает пустые списки.

    var Connection = require('tedious').Connection;  
    var config = {  
        server: 'your_server.database.windows.net',  //update me
        authentication: {
            type: 'default',
            options: {
                userName: 'your_username', //update me
                password: 'your_password'  //update me
            }
        },
        options: {
            // If you're on Microsoft Azure, you need encryption:
            encrypt: true,
            database: 'your_database'  //update me
        }
    }; 
    var connection = new Connection(config);  
    connection.on('connect', function(err) {  
        // If no error, then good to proceed.  
        console.log("Connected");  
        executeStatement();  
    });  
    
    connection.connect();
  
    var Request = require('tedious').Request;  
    var TYPES = require('tedious').TYPES;  
  
    function executeStatement() {  
        var request = new Request("SELECT c.CustomerID, c.CompanyName,COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC;", 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 ="";  
        });  
  
        request.on('done', function(rowCount, more) {  
        console.log(rowCount + ' rows returned');  
        });  
        
        // Close the connection after the final event emitted by the request, after the callback passes
        request.on("requestCompleted", function (rowCount, more) {
            connection.close();
        });
        connection.execSql(request);  
    }  

Шаг 3. Вставка строки

В этом примере показано, как безопасно выполнить инструкцию INSERT , передавая параметры, которые защищают приложение от значений внедрения SQL .

    var Connection = require('tedious').Connection;  
    var config = {  
        server: 'your_server.database.windows.net',  //update me
        authentication: {
            type: 'default',
            options: {
                userName: 'your_username', //update me
                password: 'your_password'  //update me
            }
        },
        options: {
            // If you're on Microsoft Azure, you need encryption:
            encrypt: true,
            database: 'your_database'  //update me
        }
    };  
    var connection = new Connection(config);  
    connection.on('connect', function(err) {  
        // If no error, then good to proceed.  
        console.log("Connected");  
        executeStatement1();  
    });
    
    connection.connect();
    
    var Request = require('tedious').Request  
    var TYPES = require('tedious').TYPES;  
  
    function executeStatement1() {  
        var request = new Request("INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT INSERTED.ProductID VALUES (@Name, @Number, @Cost, @Price, CURRENT_TIMESTAMP);", function(err) {  
         if (err) {  
            console.log(err);}  
        });  
        request.addParameter('Name', TYPES.NVarChar,'SQL Server Express 2014');  
        request.addParameter('Number', TYPES.NVarChar , 'SQLEXPRESS2014');  
        request.addParameter('Cost', TYPES.Int, 11);  
        request.addParameter('Price', TYPES.Int,11);  
        request.on('row', function(columns) {  
            columns.forEach(function(column) {  
              if (column.value === null) {  
                console.log('NULL');  
              } else {  
                console.log("Product id of inserted item is " + column.value);  
              }  
            });  
        });

        // Close the connection after the final event emitted by the request, after the callback passes
        request.on("requestCompleted", function (rowCount, more) {
            connection.close();
        });
        connection.execSql(request);  
    }  

Шаг 4. Подключение к проверке подлинности Windows

Мученный драйвер поддерживает проверку подлинности Windows с помощью NTLM. Чтобы подключиться к учетным данным домена вместо проверки подлинности SQL Server, измените authentication раздел в конфигурации подключения:

var Connection = require('tedious').Connection;
var config = {
    server: '<server>',  //update me
    authentication: {
        type: 'ntlm',
        options: {
            domain: '<domain>',    //update me
            userName: '<username>', //update me
            password: '<password>'  //update me
        }
    },
    options: {
        encrypt: false,
        database: '<database>',  //update me
        port: 1433
    }
};
var connection = new Connection(config);
connection.on('connect', function(err) {
    if (err) {
        console.log('Connection failed', err);
    } else {
        console.log('Connected with Windows authentication');
    }
});

connection.connect();

Замечание

Проверка подлинности NTLM требует предоставления учетных данных домена в конфигурации. Рассмотрите возможность использования пакета msnodesqlv8, который применяет собственный драйвер ODBC для доверенных подключений, использующих текущего пользователя Windows без указания учетных данных.