如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?
Posted
技术标签:
【中文标题】如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?【英文标题】:How do I create a MySQL connection pool while working with NodeJS and Express? 【发布时间】:2016-09-03 07:07:44 【问题描述】:我可以像这样创建一个 mysql 连接:
var mysql = require('mysql');
var connection = mysql.createConnection(
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
);
connection.connect();
但我更愿意创建一个池并在我的项目中使用它。
【问题讨论】:
【参考方案1】:只是为了将来帮助某人,这对我有用:
我创建了一个包含池的 mysql 连接器文件:
// Load module
var mysql = require('mysql');
// Initialize pool
var pool = mysql.createPool(
connectionLimit : 10,
host : '127.0.0.1',
user : 'root',
password : 'root',
database : 'db_name',
debug : false
);
module.exports = pool;
稍后您可以简单地将连接器包含在另一个文件中,我们称之为 manageDB.js:
var pool = require('./mysqlConnector');
并制作了一个这样的可调用方法:
exports.executeQuery=function(query,callback)
pool.getConnection(function(err,connection)
if (err)
connection.release();
throw err;
connection.query(query,function(err,rows)
connection.release();
if(!err)
callback(null, rows: rows);
);
connection.on('error', function(err)
throw err;
return;
);
);
【讨论】:
嗨..所以我也是节点新手,所以我有一些疑问。所以导出功能将在连接器文件中,对吗?要调用它,我必须将我的查询作为参数传递?【参考方案2】:你可以创建一个连接文件,我们叫dbcon.js
var mysql = require('mysql');
// connect to the db
dbConnectionInfo =
host: "localhost",
port: "3306",
user: "root",
password: "root",
connectionLimit: 5, //mysql connection pool length
database: "db_name"
;
//For mysql single connection
/* var dbconnection = mysql.createConnection(
dbConnectionInfo
);
dbconnection.connect(function (err)
if (!err)
console.log("Database is connected ... nn");
else
console.log("Error connecting database ... nn");
);
*/
//create mysql connection pool
var dbconnection = mysql.createPool(
dbConnectionInfo
);
// Attempt to catch disconnects
dbconnection.on('connection', function (connection)
console.log('DB Connection established');
connection.on('error', function (err)
console.error(new Date(), 'MySQL error', err.code);
);
connection.on('close', function (err)
console.error(new Date(), 'MySQL close', err);
);
);
module.exports = dbconnection;
现在将此连接包含到另一个文件
var dbconnection = require('../dbcon');
dbconnection.query(query, params, function (error, results, fields)
//Do your stuff
);
【讨论】:
当你调用 'connect' cmd 或者我不需要这个? 如果你想检查你的db连接是否建立,那么你可以取消注释代码中已经提到的connect cmd,否则不需要使用。【参考方案3】:Utkarsh Kaushik solution有一些bug:
如果(错误),则无法释放连接。
connection.release();
当它出现错误时,next 语句.query
总是执行,尽管它得到一个错误并导致应用程序崩溃。
虽然查询成功,但结果为null时,这种情况下我们需要检查结果是否为null。
这个解决方案在我的情况下效果很好:
exports.getPosts=function(callback)
pool.getConnection(function(err,connection)
if (err)
callback(true);
return;
connection.query(query,function(err,results)
connection.release();
if(!err)
callback(false, rows: results);
// check null for results here
);
connection.on('error', function(err)
callback(true);
return;
);
);
;
【讨论】:
【参考方案4】:你也可以通过类似的方式访问Mysql,首先在终端输入npm install mysql导入包并安装并初始化它。
const createPool = require("mysql");
const pool = createPool(
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
);
module.exports = pool;
【讨论】:
以上是关于如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?
nodejs / express:如何使用数据发布到外部表单?
如何使用 nodejs 和 express 在 REST API 中实现搜索和过滤