This repository has been archived on 2018-10-12. You can view files and clone it, but cannot push or open issues or pull requests.
node-task/node_modules/express-myconnection/lib/express-myconnection.js

126 lines
4.0 KiB
JavaScript

var _mysql,
_dbConfig,
_connection, // This is used as a singleton in a single connection strategy
_pool; // Pool singleton
/**
* Handling connection disconnects, as defined here: https://github.com/felixge/node-mysql
*/
function handleDisconnect() {
_connection = _mysql.createConnection(_dbConfig);
_connection.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000);
}
});
_connection.on('error', function (err) {
console.log('db error', err);
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
handleDisconnect();
} else {
throw err;
}
});
}
/**
* Returns middleware that will handle mysql db connections
*
* @param {Object} mysql - mysql module
* @param {Object} dbConfig - object with mysql db options
* @param {String} or undefined strategy - default is single strategy
* @return {Function}
* @api public
*/
module.exports = function (mysql, dbConfig, strategy) {
if (null == mysql) throw new Error('Missing mysql module param!');
if (null == dbConfig) throw new Error('Missing dbConfig module param!');
if (null == strategy) strategy = 'single';
// Setting _mysql module ref
_mysql = mysql;
// Setting _dbConfig ref
_dbConfig = dbConfig;
// Configuring strategies
switch (strategy) {
case 'single':
// Creating single connection instance
_connection = _mysql.createConnection(dbConfig);
handleDisconnect(dbConfig);
break;
case 'pool':
// Creating pool instance
_pool = _mysql.createPool(dbConfig);
break;
case 'request':
// Nothing at this point do be done
break;
default:
throw new Error('Not supported connection strategy!');
}
return function (req, res, next) {
var poolConnection,
requestConnection;
switch (strategy) {
case 'single':
// getConnection will return singleton connection
req.getConnection = function (callback) {
callback(null, _connection);
}
break;
case 'pool':
// getConnection handled by mysql pool
req.getConnection = function (callback) {
// Returning cached connection from a pool, caching is on request level
if (poolConnection) return callback(null, poolConnection);
// Getting connection from a pool
_pool.getConnection(function (err, connection) {
if (err) return callback(err);
poolConnection = connection;
callback(null, poolConnection);
});
}
break;
case 'request':
// getConnection creates new connection per request
req.getConnection = function (callback) {
// Returning cached connection, caching is on request level
if (requestConnection) return callback(null, requestConnection);
// Creating new connection
var connection = _mysql.createConnection(dbConfig);
connection.connect(function (err) {
if (err) return callback(err);
requestConnection = connection;
callback(null, requestConnection);
});
}
break;
}
var end = res.end;
res.end = function (data, encoding) {
// Ending request connection if available
if (requestConnection) requestConnection.end();
// Releasing pool connection if available
if (poolConnection) poolConnection.release();
res.end = end;
res.end(data, encoding);
}
next();
}
}