express-mysql-connection
Advanced tools
Comparing version 1.0.0 to 1.1.0
var _mysql, | ||
_dbConfig, | ||
_connection, // This is used as a singleton in a single connection strategy | ||
_pool; // Pool singleton | ||
_pool, // Pool singleton | ||
_middlewareFn; | ||
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; | ||
} | ||
}); | ||
} | ||
module.exports = function (mysql, dbConfig, strategy) { | ||
@@ -46,9 +26,63 @@ | ||
handleDisconnect(dbConfig); | ||
// single connection strategy | ||
// 单链接策略时返回的中间件 * * * * * * * * * * * * * * * * | ||
_middlewareFn = function(req, res, next) { | ||
req.getConnection = function (callback) { | ||
callback(null, _connection); | ||
} | ||
next(); | ||
}; | ||
break; | ||
case 'pool': | ||
// Creating pool instance | ||
_pool = _mysql.createPool(dbConfig); | ||
// pool | ||
// 连接池策略时返回的中间件 * * * * * * * * * * * * * * * * | ||
_middlewareFn = function(req, res, next) { | ||
var poolConn = null; | ||
// Returning cached connection from a pool, caching is on request level | ||
if(req.__expressMysqlConnectionCache__) { | ||
req.getConnection = function (callback) { | ||
pollConn = req.__expressMysqlConnectionCache__; | ||
callback(null, requestConn); | ||
} | ||
}else { | ||
// Getting connection from a pool | ||
req.getConnection = function (callback) { | ||
_pool.getConnection(function (err, connection) { | ||
if (err) return callback(err); | ||
poolConnection = connection; | ||
callback(null, poolConnection); | ||
}); | ||
} | ||
} | ||
closeConnection(res, poolConn); | ||
next(); | ||
} | ||
break; | ||
case 'request': | ||
// Nothing at this point do be done | ||
// request | ||
// 请求时创建连接,请求结束后自动释放 * * * * * * * * * * * * | ||
_middlewareFn = function(req, res, next) { | ||
var requestConn = null; | ||
// Returning cached connection, caching is on request level | ||
if(req.__expressMysqlConnectionCache__) { | ||
req.getConnection = function(callback) { | ||
requestConn = req.__expressMysqlConnectionCache__; | ||
callback(null, requestConn); | ||
} | ||
}else { | ||
req.getConnection = function(callback) { | ||
requestConn = _mysql.createConnection(dbConfig); | ||
requestConn.connect(function (err) { | ||
if (err) return callback(err); | ||
req.__expressMysqlConnectionCache__ = requestConn; | ||
callback(null, requestConn); | ||
}); | ||
} | ||
} | ||
closeConnection(res, null, requestConn); | ||
next(); | ||
}; | ||
break; | ||
@@ -58,78 +92,35 @@ default: | ||
} | ||
return _middlewareFn; | ||
} | ||
return function (req, res, next) { | ||
var poolConnection, | ||
requestConnection; | ||
function handleDisconnect() { | ||
_connection = _mysql.createConnection(_dbConfig); | ||
switch (strategy) { | ||
case 'single': | ||
// getConnection will return singleton connection | ||
req.getConnection = function (callback) { | ||
callback(null, _connection); | ||
} | ||
break; | ||
_connection.connect(function (err) { | ||
if (err) { | ||
console.log('error when connecting to db:', err); | ||
setTimeout(handleDisconnect, 2000); | ||
} | ||
}); | ||
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; | ||
_connection.on('error', function (err) { | ||
console.log('db error', err); | ||
if (err.code === 'PROTOCOL_CONNECTION_LOST') { | ||
handleDisconnect(); | ||
} else { | ||
throw err; | ||
} | ||
}); | ||
} | ||
// Request terminanted unexpectedly. | ||
res.on("close", function () { | ||
// Ending request connection if available | ||
if (requestConnection) requestConnection.end(); | ||
function closeConnection(res, poolConnection, requestConnection) { | ||
// Request closed unexpectedly. | ||
res.on("close", closeHandler); | ||
// Finish | ||
res.on("finish", closeHandler); | ||
// Releasing pool connection if available | ||
function closeHandler() { | ||
if (poolConnection) poolConnection.release(); | ||
}); | ||
// Normal response flow. | ||
res.on("finish", function () { | ||
// Ending request connection if available | ||
if (requestConnection) requestConnection.end(); | ||
// Releasing pool connection if available | ||
if (poolConnection) poolConnection.release(); | ||
}); | ||
// // 原关闭连接方法 | ||
// var end = res.end; | ||
// res.end = function (data, encoding) { | ||
// console.log('end2'); | ||
// // 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(); | ||
} | ||
} |
{ | ||
"name": "express-mysql-connection", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "express-mysql-connection middleware", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
express-mysql-connection | ||
============ | ||
============ | ||
一个能让你更方便连接并操作mysql的express中间件。将mysql的连接挂载到request对象上 | ||
## 安装 Install | ||
``` | ||
npm install express-mysql-connection | ||
``` | ||
## 策略 Strategies | ||
* `single` - 创建单个数据库连接,连接不会自动关闭,断开会自动尝试重连。 creates single database connection for an application instance. Connection is never closed. In case of disconnection it will try to reconnect again as described in node-mysql docs. | ||
* `pool` - 使用连接池进行数据库连接,并且使用的连接会在请求响应后自动释放回连接池。 creates pool of connections on an app instance level, and serves a single connection from pool per request. The connections is auto released to the pool at the response end. | ||
* `request` - 创建单个数据库连接,会在请求响应后自动关闭。 creates new connection per each request, and automatically closes it at the response end. | ||
## 使用 Usage | ||
### 使用中间件 | ||
``` | ||
var mysql = require('mysql'); // 需要引入mysql模块 | ||
var myConn = require('express-mysql-connection'); //引入本模块 | ||
var dbOptions = { | ||
host: 'localhost', | ||
user: 'dbuser', | ||
password: 'password', | ||
port: 3306, | ||
database: 'mydb' | ||
} // 数据库配置 | ||
var useConnRoutRs = ['/api', '/test']; // 声明需要使用数据库的路径 | ||
app.use(useConnRoutRs, myConn(mysql, dbOptions, 'pool')); // 使用 | ||
// 当然你也可以全局使用: | ||
// app.use(myConn(mysql, dbOptions, 'pool')); | ||
``` | ||
### 数据库查询 | ||
基本用法 | ||
``` | ||
app.get('api/foods', function(req, res, next) { | ||
var sql = 'SELECT * FROM food'; | ||
// 获取连接 | ||
req.getConnection(function(err, conn) { | ||
if(!err) { | ||
// 执行sql查询 | ||
conn.query(sql,function(err, sqlResult) { | ||
if(!err) { | ||
// 响应结果 | ||
res.json(sqlResult); | ||
}else { | ||
throw err; | ||
} | ||
}); | ||
}else { | ||
throw err; | ||
} | ||
}); | ||
}); | ||
``` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
7252
58