Cómo proporcionar una conexión de base de datos mysql en un solo archivo en nodejs

Necesito proporcionar la conexión mysql para los módulos. Tengo un código como este.

var express = require('express'), app = express(), server = require('http').createServer(app); var mysql = require('mysql'); var connection = mysql.createConnection({ host : '127.0.0.1', user : 'root', password : '', database : 'chat' }); connection.connect(function(err) { if (err) { console.error('error connecting: ' + err.stack); return; } }); app.get('/save', function(req,res){ var post = {from:'me', to:'you', msg:'hi'}; var query = connection.query('INSERT INTO messages SET ?', post, function(err, result) { if (err) throw err; }); }); server.listen(3000); 

Pero cómo proporcionamos una conexión mysql única para todos los módulos.

Usted podría crear una envoltura de db y luego lo requiere. Los requisitos de nodo devuelven la misma instancia de un módulo cada vez, para que pueda realizar su conexión y devolver un controlador. De los documentos de Node.js :

Cada llamada a requerir (‘foo’) obtendrá exactamente el mismo objeto devuelto, si se resolviera en el mismo archivo.

Podrías crear db.js :

 var mysql = require('mysql'); var connection = mysql.createConnection({ host : '127.0.0.1', user : 'root', password : '', database : 'chat' }); connection.connect(function(err) { if (err) throw err; }); module.exports = connection; 

Entonces en tu app.js , simplemente lo requerirías.

 var express = require('express'); var app = express(); var db = require('./db'); app.get('/save',function(req,res){ var post = {from:'me', to:'you', msg:'hi'}; db.query('INSERT INTO messages SET ?', post, function(err, result) { if (err) throw err; }); }); server.listen(3000); 

Este enfoque le permite abstraer cualquier detalle de conexión, envolver cualquier otra cosa que desee exponer y requerir db largo de su aplicación mientras mantiene una conexión a su db gracias a cómo funciona la necesidad de nodos 🙂

Tomé un enfoque similar al de Sean3z, pero en cambio tengo la conexión cerrada cada vez que hago una consulta.

Su forma de trabajo funciona si solo se ejecuta en el punto de entrada de su aplicación, pero digamos que tiene controladores que desea hacer un var db = require('./db') . No puedes porque de lo contrario cada vez que accedas a ese controlador, estarás creando una nueva conexión.

Para evitar eso, creo que es más seguro, en mi opinión, abrir y cerrar la conexión cada vez.

Aquí hay un fragmento de mi código.

mysq_query.js

 // Dependencies var mysql = require('mysql'), config = require("../config"); /* * @sqlConnection * Creates the connection, makes the query and close it to avoid concurrency conflicts. */ var sqlConnection = function sqlConnection(sql, values, next) { // It means that the values hasnt been passed if (arguments.length === 2) { next = values; values = null; } var connection = mysql.createConnection(config.db); connection.connect(function(err) { if (err !== null) { console.log("[MYSQL] Error connecting to mysql:" + err+'\n'); } }); connection.query(sql, values, function(err) { connection.end(); // close the connection if (err) { throw err; } // Execute the callback next.apply(this, arguments); }); } module.exports = sqlConnection; 

Que se puede usar en cualquier lugar haciendo simplemente

 var mysql_query = require('path/to/your/mysql_query'); mysql_query('SELECT * from your_table where ?', {id: '1'}, function(err, rows) { console.log(rows); }); 

ACTUALIZADO: config.json se parece a

 { "db": { "user" : "USERNAME", "password" : "PASSWORD", "database" : "DATABASE_NAME", "socketPath": "/tmp/mysql.sock" } } 

Espero que esto ayude.

prueba esto

 var express = require('express'); var mysql = require('mysql'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace console.log(app); if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); var con = mysql.createConnection({ host: "localhost", user: "root", password: "admin123", database: "sitepoint" }); con.connect(function(err){ if(err){ console.log('Error connecting to Db'); return; } console.log('Connection established'); }); module.exports = app; 
 var mysql = require('mysql'); var pool = mysql.createPool({ host : 'yourip', port : 'yourport', user : 'dbusername', password : 'dbpwd', database : 'database schema name', dateStrings: true, multipleStatements: true }); // TODO - if any pool issues need to try this link for connection management // https://stackoverflow.com/questions/18496540/node-js-mysql-connection-pooling module.exports = function(qry, qrytype, msg, callback) { if(qrytype != 'S') { console.log(qry); } pool.getConnection(function(err, connection) { if(err) { if(connection) connection.release(); throw err; } // Use the connection connection.query(qry, function (err, results, fields) { connection.release(); if(err) { callback('E#connection.query-Error occurred.#'+ err.sqlMessage); return; } if(qrytype==='S') { //for Select statement // setTimeout(function() { callback(results); // }, 500); } else if(qrytype==='N'){ let resarr = results[results.length-1]; let newid= ''; if(resarr.length) newid = resarr[0]['@eid']; callback(msg + newid); } else if(qrytype==='U'){ //let ret = 'I#' + entity + ' updated#Updated rows count: ' + results[1].changedRows; callback(msg); } else if(qrytype==='D'){ //let resarr = results[1].affectedRows; callback(msg); } }); connection.on('error', function (err) { connection.release(); callback('E#connection.on-Error occurred.#'+ err.sqlMessage); return; }); }); 

}

Creo que deberías usar un grupo de conexiones en lugar de compartir una sola conexión. Un grupo de conexiones proporcionaría un rendimiento mucho mejor, como puede comprobar aquí .

Como se indica en la documentación de la biblioteca, se produce porque el protocolo MySQL es secuencial (esto significa que necesita varias conexiones para ejecutar consultas en paralelo).

Documentos de la piscina de conexión

En la documentación de node.js, “Para que un módulo ejecute el código varias veces, exporte una función y llame a esa función”, puede usar node.js module.export y tener un solo archivo para administrar las conexiones de la base de datos. Puede encontrar Más en la documentación de Node.js. Digamos que el archivo db.js es como:

  const mysql = require('mysql'); var connection; module.exports = { dbConnection: function () { connection = mysql.createConnection({ host: "127.0.0.1", user: "Your_user", password: "Your_password", database: 'Your_bd' }); connection.connect(); return connection; } }; 

Entonces, el archivo en el que va a utilizar la conexión podría ser como useDb.js:

 const dbConnection = require('./db'); var connection; function callDb() { try { connection = dbConnectionManager.dbConnection(); connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { if (!error) { let response = "The solution is: " + results[0].solution; console.log(response); } else { console.log(error); } }); connection.end(); } catch (err) { console.log(err); } }