如何在nodejs中的单个文件中提供mysql数据库连接

我需要提供模块的mysql连接。 我有这样的代码。

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); 

但是我们如何为所有模块提供一次mysql连接。

你可以创build一个数据库包装,然后需要它。 node的require每次都返回一个模块的实例,所以你可以执行你的连接并返回一个处理程序。 从Node.js文档 :

每次调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。

你可以创builddb.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; 

然后在你的app.js ,你只需要它。

 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); 

这种方法允许你抽象任何连接的细节,包装任何你想要公开的,并要求在整个应用程序db ,同时保持一个连接到你的分贝感谢如何节点需要工作:)

我采取了与Sean3z类似的方法,但是我每次进行查询时都closures了连接。

他的方式,如果它只是在你的应用程序的入口点执行,但假设你有控制器,你想做一个var db = require('./db') 。 你不能,因为否则每次你访问该控制器,你将创build一个新的连接。

为了避免这种情况,我认为每次打开和closures连接都是比较安全的。

这是我的代码片段。

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; 

比你可以在任何地方使用它只是做像

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

更新: config.json看起来像

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

希望这可以帮助。

尝试这个

 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; 

从node.js文档中,“要让模块多次执行代码,导出函数并调用该函数”,您可以使用node.js module.export并使用单个文件来pipe理数据库连接。您可以更多的Node.js文档 。 比方说db.js文件是这样的:

  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; } }; 

然后,你将要使用连接的文件就像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); } }