【问题标题】:How do I create a MySQL connection pool while working with NodeJS and Express?如何在使用 NodeJS 和 Express 时创建 MySQL 连接池?
【发布时间】: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();

但我更愿意创建一个池并在我的项目中使用它。

【问题讨论】:

    标签: mysql node.js express npm connection-pooling


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        相关资源
        最近更新 更多