Cómo conectarse a una base de datos SQL Server desde Node.js

Con el paquete de Microsoft de SQL Server para Node.js, las aplicaciones de servidor pueden conectarse a un servidor de SQL Azure directamente. Esto permite que podamos utilizar toda la potencia de un motor de base de datos relacionar durante el desarrollo de aplicaciones web basadas en Node.js

Configurando el entorno de trabajo

El driver de SQL Server para Node.js utiliza el SQL Server Native Client que permite a todas las aplicaciones utilizar las características de SQL Server. Aunque en Windows Azure este cliente está disponible para todos los tipos de hosting, puede que en durante el desarrollo local sea necesario instalar este paquete.

Este se puede descargar desde aquí: https://www.microsoft.com/en-us/download/details.aspx?id=29065

Creando una base de datos SQL Server

Antes de poder empezar hay que crear una base de datos desde cero, para ello, desde el portal de Windows Azure, hay que pulsar en +New y luego ir a Data Services, una vez allí seleccionar SQL Database

clip_image002

El siguiente paso es rellenar el tipo de servidor, Web o Business y el tamaño de la base de datos.

clip_image004

Una vez seleccionado se procede a introducir las credenciales del servidor de base de datos que alojará la base de datos.

clip_image006

A partir de ese instante ya está creada la base de datos y se puede proceder a utilizarla desde Node.js

Instalando el paquete de node-sqlserver

En el anterior artículo Trabajando con Windows Azure Storage desde Node.js se especificaba un fichero llamado package.json que contenía la configuración de la aplicación de Node.js y además definía las dependencias de la misma. Ahora al usar node-sqlserver hay que añadirlo como dependencia para que el sistema pueda descargar el paquete durante el proceso de npm install que se ejecuta cuando se hace el despliegue a Windows Azure.

 {
    {
        "name": "DpeSpainNodeJS",
        "version": "0.1.0",
        "private": false,
        "scripts": {
        "start": "node app.js"
    },
        "dependencies": {
            "express": "3.4.8",
            "jade": "*",
            "azure": "*",
            "node-sqlserver": "*"
    }
}

Para poder continuar con la instalación del paquete de node-sqlserver se necesitan los siguientes prerrequisitos previos:

  • Node-gyp, que se puede instalar a través de npm install –g node-gyp
  • Python 2.7.x para node-gyp. Es importante que sea esta versión porque si no, no se podrá compilar el paquete.
  • Visual C++ 2010
  • SQL Server Native Client

Una vez que se han resuelto estos prerrequisitos el siguiente paso es ejecutar el comando de npm install que resuelve todas las dependencias de esta aplicación.

Ejecutando una consulta contra SQL Server

Una vez que ya se tiene el módulo de SQL Server para Node.js ya se pueden ejecutar consultas con respecto la base de datos. Para empezar a trabajar el primer paso es tener la cadena de conexión al servidor de base de datos donde está alojada la base de datos.

Las cadenas de conexión de SQL Server tienen este aspecto:

 Driver={SQL Server Native Client 
10.0};Server=tcp:{dbservername}.database.windows.net,1433;Database={database};Uid={username};Pwd={password};Encrypt=yes;Connection 
Timeout=30;"

Y esa cadena de conexión hay que proporcionarla cada vez que se hace una consulta al driver.

 var sql = require('node-sqlserver');

var conn_str = "Driver={SQL Server Native Client 10.0};Server=tcp:{dbservername}.database.windows.net,1433;Database={database};Uid={username};Pwd={password};Encrypt=yes;Connection 
Timeout=30;";

sql.query(conn_str, "SELECT * FROM TestTable", function (err, results) {
    if (err) {
        res.writeHead(500, { 'Content-Type': 'text/plain' });
        res.write("Got error :-( " + err);
        res.end("");
        return;
    }
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    for (var i = 0; i < results.length; i++) {
    res.write("ID: " + results[i].ID + " Column1: " + results[i].Column1 + " 
    Column2: " + results[i].Column2);
    }

    res.end("; Done.");
});

Además de eso el objeto que devuelve el método query tiene varios eventos que permiten ser notificados en base a los diferentes tipos de eventos que el sistema proporcional.

A continuación una lista de esos eventos.

 var stmt = sql.query(conn_str, "SELECT * FROM TestTable");
stmt.on('meta', function (meta) { console.log("We've received the metadata"); });
stmt.on('row', function (idx) { console.log("We've started receiving a row"); });
stmt.on('column', function (idx, data, more) { console.log(idx + ":" + data);});
stmt.on('done', function () { console.log("All done!"); });
stmt.on('error', function (err) { console.log("We had an error: " + err); });

Consideraciones a la hora de publicar en Windows Azure

Windows Azure no instala dinámicamente el paquete de node-sqlserver en tiempo de ejecución, por lo que se tiene que tener cuidado de incluir el binario en la carpeta.

El fichero binario se llamada sqlserver.node y sql.js y se puede descargar desde la web de Microsoft

Luis Guerrero.

Technical Evangelist Windows Azure.

@guerrerotook