MySQL con Node.js


376

Acabo de empezar a entrar en Node.js. Vengo de un fondo PHP, así que estoy bastante acostumbrado a usar MySQL para todas mis necesidades de base de datos.

¿Cómo puedo usar MySQL con Node.js?


55
¿con qué terminaste yendo? a continuación hay buena información, me interesaría saber cuáles fueron sus experiencias
— Landon

77
@Landon, en realidad fue con node-mysql por algunas razones, principalmente porque está en un desarrollo bastante activo y parece ser el más utilizado. También me gusta mucho la multipleStatementsfunción.
— crawf

@crawf ¿Qué prefieres, PHP o Node.js? Me metí en PHP / MySQL, pero estoy pensando en cambiar al nodo, ya que se sentiría mucho más natural teniendo en cuenta que la sintaxis es sintaxis JS
— oldboy

1
@Anthony Preferencia personal, supongo, depende del ecosistema en el que se está desarrollando, si está en un equipo, etc. Esta publicación original es antigua, y mucho ha cambiado en el panorama Node, donde es mucho más común para el frente y trabajo de fondo. Diría que si tienes tiempo para probar Node, y es genial emparejado con cosas como socket.io para sockets web en tiempo real.
— crawf

Respuestas:


427

Echa un vistazo a la lista de módulos de node.js

  • node-mysql : un módulo node.js que implementa el protocolo MySQL
  • node-mysql2 : otro controlador asíncrono JS puro. Canalización, declaraciones preparadas.
  • node-mysql-libmysqlclient - Enlaces asíncronos MySQL basados ​​en libmysqlclient

node-mysql parece bastante simple:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret',
});

connection.connect(function(err) {
  // connected! (unless `err` is set)
});

Consultas:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  // Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

81
+1 para node-mysql realmente hace que sea más fácil usar declaraciones preparadas que no usarlas
— Kevin Laity

2
github.com/bminer/node-mysql-queues para transacciones y soporte de múltiples declaraciones para usar con node-mysql.
— BMiner

2
+1 para node-mysql también. ¿Qué puede ser mejor que simplemente requirecrear una biblioteca de JavaScript?
— Alex K

44
@KevinLaity Tenía la impresión de que node-mysql todavía no tiene implementadas declaraciones preparadas. La sintaxis solo se ve similar . En cambio, parece que, por ahora, se están escapando caracteres especiales.
— funseiki

44
Además, puede obtener el nombre de su base de datos agregando 'base de datos' al objeto de conexión
— felipekm

29

node-mysql es probablemente uno de los mejores módulos utilizados para trabajar con la base de datos MySQL que se mantiene activamente y está bien documentado.


20

Dado que este es un hilo antiguo que solo agrega una actualización:

Para instalar el controlador MySQL node.js:

Si ejecuta solo npm install mysql, debe estar en el mismo directorio donde ejecuta su servidor. Aconsejaría hacerlo como en uno de los siguientes ejemplos:

Para instalación global:

npm install -g mysql

Para instalación local:

1- Añádelo a tu package.jsonen las dependencias:

"dependencies": {
    "mysql": "~2.3.2",
     ...

2- correr npm install


Tenga en cuenta que para que las conexiones sucedan, también deberá ejecutar el servidor mysql (que es independiente del nodo)

Para instalar el servidor MySQL:

Hay un montón de tutoriales que explican esto, y depende un poco del sistema operativo. Solo ve a google y busca how to install mysql server [Ubuntu|MacOSX|Windows]. Pero en una oración: tienes que ir a http://www.mysql.com/downloads/ e instalarlo.


3
npm install --save mysqllo instalará, agréguelo a su package.jsonautomáticamente
— Xeoncross

11

Aquí hay un código de producción que puede ayudarlo.

Package.json

{
  "name": "node-mysql",
  "version": "0.0.1",
  "dependencies": {
    "express": "^4.10.6",
    "mysql": "^2.5.4"
  }
}

Aquí está el archivo del servidor.

var express   =    require("express");
var mysql     =    require('mysql');
var app       =    express();

var pool      =    mysql.createPool({
    connectionLimit : 100, //important
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'address_book',
    debug    :  false
});

function handle_database(req,res) {

    pool.getConnection(function(err,connection){
        if (err) {
          connection.release();
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        }   

        console.log('connected as id ' + connection.threadId);

        connection.query("select * from user",function(err,rows){
            connection.release();
            if(!err) {
                res.json(rows);
            }           
        });

        connection.on('error', function(err) {      
              res.json({"code" : 100, "status" : "Error in connection database"});
              return;     
        });
  });
}

app.get("/",function(req,res){-
        handle_database(req,res);
});

app.listen(3000);

Referencia: https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/


Este código parece estar jodido ... muchos errores incluyendoCannot read property 'release' of undefined
— Pacerier

4

Imo, deberías probar MySQL Connector / Node.js, que es el controlador oficial de Node.js para MySQL. Ver ref-1 y ref-2 para una explicación detallada. He intentado mysqljs / mysql que está disponible aquí , pero no encuentro documentación detallada sobre clases, métodos, propiedades de esta biblioteca.

Así que cambié al estándar MySQL Connector/Node.jscon X DevAPI, ya que es una biblioteca de cliente asincrónica basada en Promise y proporciona buena documentación. Eche un vistazo al siguiente fragmento de código:

const mysqlx = require('@mysql/xdevapi');
const rows = [];

mysqlx.getSession('mysqlx://localhost:33060')
.then(session => {
    const table = session.getSchema('testSchema').getTable('testTable');

    // The criteria is defined through the expression.
    return table.update().where('name = "bar"').set('age', 50)
        .execute()
        .then(() => {
            return table.select().orderBy('name ASC')
                .execute(row => rows.push(row));
        });
})
.then(() => {
    console.log(rows);
});

3

KnexJs se puede utilizar como un generador de consultas SQL tanto en Node.JS como en el navegador. Me resulta fácil de usar. Vamos a probarlo - Knex.js

$ npm install knex --save
# Then add one of the following (adding a --save) flag:
$ npm install pg
$ npm install sqlite3
$ npm install mysql
$ npm install mysql2
$ npm install mariasql
$ npm install strong-oracle
$ npm install oracle
$ npm install mssql


var knex = require('knex')({
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});

Puedes usarlo así

knex.select('*').from('users')

o

knex('users').where({
  first_name: 'Test',
  last_name:  'User'
}).select('id')

1

También puede probar un nuevo esfuerzo conocido como Node.js DB que tiene como objetivo proporcionar un marco común para varios motores de bases de datos. Está construido con C ++, por lo que el rendimiento está garantizado.

Específicamente, podría usar su controlador db-mysql para el soporte Node.js MySQL .


1
¡Gracias! Yo también lo intentaré.
— crawf

44
node-db ya no es compatible (inactivo durante 8 meses, usa node-waf en desuso) y la instalación falló.
— Yogu

18
"Está construido con C ++, por lo que el rendimiento está garantizado": simplemente usar C ++ no garantiza el rendimiento, aún debe programarse correctamente.
— developerbmw

No solo no es compatible con node-db, sino que el enlace está inactivo, redirigido a algún tipo de sitio de anuncios en este momento. Votación a favor.
— nurdglaw

2
@Mariano, Link Down
— Pacerier

0

conecta la base de datos mysql instalando una biblioteca. aquí, elegimos el módulo nodo-mysql estable y fácil de usar.

npm install mysql@2.0.0-alpha2

var http = require('http'),
   mysql = require('mysql');

var sqlInfo = {
   host: 'localhost',
   user: 'root',
   password: 'urpass',
   database: 'dbname'
}
client = mysql.createConnection(sqlInfo);

client.connect();

Para el ejemplo de conexión y consulta de MySQL de NodeJS


2
Hasta donde yo sé, las versiones alfa nunca deben considerarse como "estables". Corrígeme si estoy equivocado. Alpha tiene la posibilidad de cambiar drásticamente su API antes de pasar a la final, lo que es altamente no deseado en el código de producción (e incluso de desarrollo). Es decir, si la numeración de la versión sigue las pautas de semver.org .
— Robin van Baalen

1
Las comillas "inteligentes" ('') resultan no ser tan inteligentes en los archivos js.
— glifo

Me gusta este comentario porque muestra dónde poner el nombre de la base de datos
— Boris Ivanov

0

Puede omitir el ORM, los constructores, etc. y simplificar su administración de DB / SQL usando sqlery sqler-mdb.

-- create this file at: db/mdb/setup/create.database.sql
CREATE DATABASE IF NOT EXISTS sqlermysql
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.setup.create.database();

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.