como-usar-mssql-con-nodejs

Cómo usar una base de datos MSSQL con Node.js

El módulo mssql es una biblioteca de Node.js diseñada para interactuar con bases de datos MSSQL (Microsoft SQL Server) de manera asincrónica.

Ofrece una interfaz sencilla para realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones.

Para que funcione deberéis tener una base de datos MSSQL accesible, y configurada con

  • Usuario válido
  • Escuchando llamadas TCP
  • Con SQL Browser activado

Cómo conectar Node.js a MSSQL

Primero, necesitas instalar el módulo mssql en tu proyecto. Puedes hacerlo utilizando npm:

npm install mssql

Para conectar Node.js con Microsoft SQL Server podemos utilizar diferentes controladores TDS. Los dos principales son:

  • Tedious: Este controlador está escrito en JavaScript puro y es compatible con Windows, macOS y Linux. Es el controlador predeterminado para Node.js y se utiliza ampliamente en aplicaciones que se ejecutan en diversas plataformas.
  • Microsoft / Contributors Node V8 Driver for Node.js for SQL Server (v2): Este controlador es nativo y está optimizado para Windows o Linux/macOS de 64 bits. Aunque es menos común que Tedious, funciona de maravilla.

Configuración de la Conexión

Para establecer una conexión con nuestra base de datos MSSQL, primero debemos hacer la configuración con los datos de nuestro servidor. Además, hay opciones adicionales que pueden ser necesarias dependiendo de la configuración de vuestra base de datos.

Veamos un ejemplo básico de configuración osando Tedious, que es el driver por defecto.

const dbConfig = {
  user: 'tu_usuario',
  password: 'tu_password',
  server: 'localhost',  // Puede ser una dirección IP o nombre del servidor
  port: 1433,
  database: 'nombre_de_tu_base_de_datos',
  dialect: "mssql",
  options: {
    encrypt: false,
    trustServerCertificate: true,
    trustedConnection: true,  
  },
};

::: tip En este ejemplo, sustituye 'tu_usuario', 'tu_contraseña', 'localhost' y 'nombre_de_tu_base_de_datos' con los valores específicos de tu entorno. :::

Estableciendo la Conexión

Una vez que tenemos nuestra configuración, podemos utilizar mssql para establecer la conexión a la base de datos:

import sql from 'mssql';

import dbConfig from './dbConfig.mjs';

// Función para conectarse y realizar una consulta
async function conectarYConsultar() {
  try {
    // Conectarse a la base de datos
    await sql.connect(config);

    // Consulta SQL
    const result = await sql.query`SELECT * FROM TuTabla`;

    // Imprimir resultados
    console.dir(result);

  } catch (err) {
    // Manejar errores
    console.error('Error al intentar conectarse:', err);
  } finally {
    // Cerrar la conexión al finalizar
    sql.close();
  }
}

// Llamar a la función para conectar y consultar
conectarYConsultar();

En este ejemplo:

  • config contiene los detalles de la conexión, como el usuario, contraseña, servidor y base de datos.
  • La función conectarYConsultar se encarga de conectarse a la base de datos, ejecutar una consulta (SELECT * FROM TuTabla) y mostrar los resultados.

Trusted connection

Si queréis usar Integrated Security / Trusted Connection, lo mejor es que instaléis el Driver msnodesqlv8 para node-sql.

npm install msnodesqlv8

Ahora cambiáis vuestro fichero de configuración a los siguiente

const sql = require('mssql/msnodesqlv8');

var dbConfig = {
  server: 'localhost',
  port: 1433,
  database: 'curso',
  driver: "msnodesqlv8",
  options: {
    trustedConnection: true,    
  }
}

En el fichero de nuestra app, tendemos que cambiar los import porque msnodesqlv8 es una librería CommonJS, de las que dan problemas de uso si no lo importamos require de node:module

Así que quedaría algo así,

import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const sql = require('mssql/msnodesqlv8');

import dbConfig from './dbconnection.mjs';

async function conectarYConsultar() {
    try {
      // resto del contenido
      ///...
}

Consultas SQL

Ahora que estamos conectados a nuestra base de datos MSSQL, podemos ejecutar consultas SQL para interactuar con los datos. mssql proporciona métodos para realizar consultas de manera segura y efectiva.

Consulta Simple

Para una consulta básica que obtiene todos los registros de una tabla, podemos usar:

async function consultarDatos() {
  try {
    const result = await sql.query`SELECT * FROM TuTabla`;
    console.dir(result);
  } catch (error) {
    console.error('Error al ejecutar la consulta:', error);
  }
}

En este ejemplo, TuTabla representa el nombre de la tabla en tu base de datos. Los resultados de la consulta se imprimirán en la consola.

Consulta Parametrizada

Las consultas parametrizadas son útiles para evitar ataques de inyección SQL y para proporcionar una forma más segura y eficiente de ejecutar consultas con valores variables.

async function consultaParametrizada() {
  try {
    const nombre = 'John';
    const result = await sql.query`SELECT * FROM TuTabla WHERE Nombre = ${nombre}`;
    console.dir(result);
  } catch (error) {
    console.error('Error al ejecutar la consulta parametrizada:', error);
  }
}

En este ejemplo, nombre es un parámetro que se utiliza en la consulta para filtrar los resultados por el nombre especificado.

Transacciones

Las transacciones son importantes para garantizar la integridad de los datos al realizar operaciones que deben ser atómicas.

async function ejecutarTransaccion() {
  try {
    await sql.connect(config);
    const transaction = new sql.Transaction();
    await transaction.begin();

    const result1 = await transaction.request().query('INSERT INTO TuTabla (campo1, campo2) VALUES (valor1, valor2)');
    const result2 = await transaction.request().query('UPDATE OtraTabla SET campo = nuevo_valor WHERE condicion');

    await transaction.commit();
    console.log('Transacción completada.');
  } catch (error) {
    console.error('Error al ejecutar la transacción:', error);
    await transaction.rollback();
  } finally {
    sql.close();
  }
}

En este ejemplo, se crea una transacción donde se ejecutan dos consultas. Si alguna de las consultas falla, la transacción se revierte para mantener la integridad de los datos.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github github-full