2012-04-25 145 views
23

La pregunta duplica algunas preguntas anteriores, pero las cosas pueden haber cambiado desde entonces.Conectarse a la base de datos de SQL Server desde Node.js

¿Hay alguna ayuda oficial para conectarse a SQL Server desde Node.js (por ejemplo, biblioteca oficial de MS)? ¿O al menos una biblioteca de terceros bien mantenida apropiada para una aplicación de grado de producción?

Usamos la combinación de ASP.NET MVC/SQL Server, pero actualmente tengo una tarea para la cual express/Node.js parece ser más apropiado (y me gustaría jugar con algo nuevo), por lo que la pregunta es si podemos confiar en una interacción entre Node.js y SQL Server.

UPD: Parece que Microsoft tiene, por fin, publicado el piloto oficial: https://github.com/WindowsAzure/node-sqlserver

+0

He estado buscando una solución para esto Hace un par de semanas ... gracias por agregar la pregunta. En este momento también estoy usando una aplicación MVC delgada para manejar la conexión SQL, pero no me gusta. Es molesto que todas las respuestas que puedo encontrar apuntan a los mismos módulos que no funcionan. –

+1

@MarcelPopescu https://github.com/pekim/tedious parece funcionar para mí, con las siguientes limitaciones: no es compatible con las transacciones (incluso aquellas no emitidas explícitamente por usted pero que ocurren en procedimientos almacenados), y no es compatible. procedimientos que devuelven múltiples conjuntos de resultados. Los procedimientos que devuelven múltiples conjuntos de resultados se deben volver a escribir de todos modos en mi humilde opinión; pero vivir sin transacciones está limitando el uso de Node.js + MSSQL a unas interfaces simples y casi transparentes (afortunadamente, esto es lo que estoy escribiendo). – penartur

+0

@MarcelPopescu Espero que algún día MS lanzará un controlador MSSQL oficial para Node, como lo hicieron con el resto de sus características de la plataforma Azure. Aunque en ese momento probablemente dejaré el empleador actual y usaré Postgres bueno: D – penartur

Respuesta

13

No estoy seguro viste esta lista de MS SQL Modules for Node JS

Comparta su experiencia después de usar uno si es posible.

buena suerte

+2

'tsqlftw' parece estar inactivo; 'node-mssql' ya no está disponible; 'tedious' depende de' iconv' que usa 'node-waf' que no está disponible en Windows, por lo que parece que me queda la única opción de' tds'. Al menos hoy pude conectarme a DB con él, aunque todavía no realicé ninguna consulta. – penartur

+0

: o, ¡Buena suerte! – Futur

+1

Por cierto, 'iconv' es solo opcional para' tedioso', así que actualmente estoy jugando con 'tedioso' (sin embargo, todavía no se han hecho cosas serias). 'tds' no funcionó para mí: https://github.com/cretz/node-tds/issues/25 – penartur

2

Hay un módulo sobre la NGP llamada mssqlhelper

Puede instalarlo en su proyecto por npm i mssqlhelper

Ejemplo de conexión y realización de una consulta:

var db = require('./index'); 

db.config({ 
    host: '192.168.1.100' 
    ,port: 1433 
    ,userName: 'sa' 
    ,password: '123' 
    ,database:'testdb' 
}); 

db.query(
    'select @Param1 Param1,@Param2 Param2' 
    ,{ 
     Param1: { type : 'NVarChar', size: 7,value : 'myvalue' } 
     ,Param2: { type : 'Int',value : 321 } 
    } 
    ,function(res){ 
     if(res.err)throw new Error('database error:'+res.err.msg); 
     var rows = res.tables[0].rows; 
     for (var i = 0; i < rows.length; i++) { 
      console.log(rows[i].getValue(0),rows[i].getValue('Param2')); 
     } 
    } 
); 

Puede leer más al respecto aquí: https://github.com/play175/mssqlhelper

: o)

+3

Gracias por su respuesta, pero tener menos de un mes de antigüedad, mantenido por un único desarrollador, que contiene comentarios en chino, no da una impresión confiable de la calidad de producción de la biblioteca. Además, al mirar el código, parece que este 'mssqlhelper' es realmente una capa delgada sobre la biblioteca' tds' mencionada en las preguntas anteriores sobre ese asunto. Me gustaría escuchar acerca de bibliotecas confiables y bien mantenidas (idealmente, de Microsoft mismo), no sobre las envolturas delgadas sobre las bibliotecas conocidas. – penartur

+0

Y, por cierto, parece que el autor también ha robado el código fuente del paquete TDS (https://github.com/cretz/node-tds/tree/master/lib) para su mssqlhelper, pretendiendo que * play175 * lo escribieron ellos solos – penartur

6

Acabamos de publicar controlador de vista previa para Node.JS para la conectividad de SQL Server. Puede encontrarlo aquí: Introducing the Microsoft Driver for Node.JS for SQL Server.

El controlador es compatible con las devoluciones de llamada (en este caso, nos estamos conectando a una instancia local de SQL Server):

// Query with explicit connection 
var sql = require('node-sqlserver'); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server=(local);Database=AdventureWorks2012;Trusted_Connection={Yes}"; 

sql.open(conn_str, function (err, conn) { 
    if (err) { 
     console.log("Error opening the connection!"); 
     return; 
    } 
    conn.queryRaw("SELECT TOP 10 FirstName, LastName FROM Person.Person", function (err, results) { 
     if (err) { 
      console.log("Error running query!"); 
      return; 
     } 
     for (var i = 0; i < results.rows.length; i++) { 
      console.log("FirstName: " + results.rows[i][0] + " LastName: " + results.rows[i][1]); 
     } 
    }); 
}); 

Como alternativa, puede utilizar los eventos (en este caso, nos estamos conectando a SQL Azure también conocido como Windows Azure SQL base de datos):

// Query with streaming 
var sql = require('node-sqlserver'); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server={tcp:servername.database.windows.net,1433};UID={username};PWD={Password1};Encrypt={Yes};Database={databasename}"; 

var stmt = sql.query(conn_str, "SELECT FirstName, LastName FROM Person.Person ORDER BY LastName OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY"); 
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); }); 

Si surge algún problema, por favor, presentar un problema en Github: https://github.com/windowsazure/node-sqlserver/issues

+1

+1 (y sigue activo - ¡yay!), Pero ¿cómo nos ayuda esto a vincularnos con los productos relacionados con Visual Studio/.NET? Tus planes de marketing ... me confunden. –

+1

¿cómo cierras las conexiones db? – gjw80

+0

Gran pregunta. ¿Cómo se eliminan las conexiones? –

0

msnodesql está funcionando de maravilla para yo. Aquí hay una muestra:

var mssql = require('msnodesql'), 
    express = require('express'), 
    app = express(), 
    nconf = require('nconf') 

nconf.env() 
    .file({ file: 'config.json' }); 

var conn = nconf.get("SQL_CONN"); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server=server.name.here;Database=Product;Trusted_Connection={Yes}"; 

app.get('/api/brands', function(req, res){ 
    var data = []; 
    var jsonObject = {};  

    mssql.open(conn_str, function (err, conn) { 
     if (err) { 
      console.log("Error opening the connection!"); 
      return; 
     } 
     conn.queryRaw("dbo.storedproc", function (err, results) { 
     if(err) { 
        console.log(err); 
        res.send(500, "Cannot retrieve records."); 
       } 
     else { 
      //res.json(results); 

      for (var i = 0; i < results.rows.length; i++) { 
       var jsonObject = new Object() 
       for (var j = 0; j < results.meta.length; j++) { 

        paramName = results.meta[j].name; 
        paramValue = results.rows[i][j]; 
        jsonObject[paramName] = paramValue; 

        } 
        data.push(jsonObject); //This is a js object we are jsonizing not real json until res.send    
      } 

       res.send(data); 

      }  
     }); 
    }); 
}); 
19

Esto es principalmente para lectores futuros. Como la pregunta (al menos el título) se centra en "conectarse a la base de datos del servidor SQL desde el nodo js", me gustaría introducir el módulo de nodo "mssql".

En este momento, tenemos una versión estable del controlador de Microsoft SQL Server para NodeJs ("msnodesql") disponible aquí: https://www.npmjs.com/package/msnodesql. Si bien hace un gran trabajo de integración nativa a la base de datos de Microsoft SQL Server (que cualquier otro módulo de nodo), hay un par de cosas para tener en cuenta.

"msnodesql" requieren algunos requisitos previos (como python, VC++, cliente nativo de SQL, etc.) para instalarse en el equipo host. Eso hace que su aplicación "nodo" "Windows" dependa.Si está satisfecho con la implementación basada en "Windows", trabajar con "msnodesql" es lo mejor.

Por otro lado, hay otro módulo llamado "mssql" (disponible aquí https://www.npmjs.com/package/mssql) que puede funcionar con "tedioso" o "msnodesql" en función de la configuración. Si bien este módulo puede no ser tan completo como "msnodesql", prácticamente resuelve la mayoría de las necesidades.

Si desea comenzar con "MSSQL", me encontré con un simple y sencillo vídeo hacia delante, lo que explica acerca de la conexión a la base de datos de Microsoft SQL Server mediante nodejs aquí: https://www.youtube.com/watch?v=MLcXfRH1YzE

El código fuente para el vídeo de arriba es disponible aquí: http://techcbt.com/Post/341/Node-js-basic-programming-tutorials-videos/how-to-connect-to-microsoft-sql-server-using-node-js

por si acaso, si los enlaces anteriores no están trabajando, estoy incluyendo el código fuente aquí:

var sql = require("mssql"); 
 

 
var dbConfig = { 
 
    server: "localhost\\SQL2K14", 
 
    database: "SampleDb", 
 
    user: "sa", 
 
    password: "sql2014", 
 
    port: 1433 
 
}; 
 

 
function getEmp() { 
 
    var conn = new sql.Connection(dbConfig); 
 
    
 
    conn.connect().then(function() { 
 
     var req = new sql.Request(conn); 
 
     req.query("SELECT * FROM emp").then(function (recordset) { 
 
      console.log(recordset); 
 
      conn.close(); 
 
     }) 
 
     .catch(function (err) { 
 
      console.log(err); 
 
      conn.close(); 
 
     });   
 
    }) 
 
    .catch(function (err) { 
 
     console.log(err); 
 
    }); 
 

 
    //--> another way 
 
    //var req = new sql.Request(conn); 
 
    //conn.connect(function (err) { 
 
    // if (err) { 
 
    //  console.log(err); 
 
    //  return; 
 
    // } 
 
    // req.query("SELECT * FROM emp", function (err, recordset) { 
 
    //  if (err) { 
 
    //   console.log(err); 
 
    //  } 
 
    //  else { 
 
    //   console.log(recordset); 
 
    //  } 
 
    //  conn.close(); 
 
    // }); 
 
    //}); 
 

 
} 
 

 
getEmp();

El código de arriba es bastante auto explicativo. Definimos los parámetros de conexión db (en el objeto JS "dbConfig") y luego usamos el objeto "Conexión" para conectarnos a SQL Server. Para ejecutar una instrucción "SELECT", en este caso, usa el objeto "Request" que trabaja internamente con el objeto "Connection". El código explica ambos sabores del uso de ejecuciones basadas en "promesa" y "devolución de llamada".

El código fuente anterior solo explica cómo conectarse a la base de datos del servidor SQL y ejecutar una consulta SELECT. Usted puede tomar fácilmente al siguiente nivel, siguiendo la documentación del nodo "MSSQL", disponible en: https://www.npmjs.com/package/mssql

ACTUALIZACIÓN: Hay un nuevo video que realiza operaciones CRUD estándar usando Node.js puro descanso (con Microsoft SQL Servidor) aquí: https://www.youtube.com/watch?v=xT2AvjQ7q9E. Es un video fantástico que explica todo desde cero (tiene mucho código y no será tan agradable explicar/copiar todo el código aquí)

+0

Uso node-mssql y es increíble, el repositorio de origen es: https://github.com/patriksimek/node-mssql – Kalamarico

+0

El enlace de video fue realmente útil. https://www.youtube.com/watch?v=MLcXfRH1YzE –

+1

He seguido esto, pero sigo recibiendo "sql.connection en un constructor". – cleverpaul

Cuestiones relacionadas