如何在使用 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 中实现搜索和过滤

如何使用 nodejs / express 将数据存储在 mongodb 中?

如何使用 nodejs / express 上传和读取文件

如何使用两个令牌(访问/刷新)进行授权(nodejs,express)