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.