NPM MySql连接需要在文件中分开

时间:2016-09-01 09:10:53

标签: mysql node.js npm

我希望使用npm MySQL创建与单独文件的连接。我期望在每次触发查询时导出连接变量或池变量。如果我将其他文件分开,我当前的方法每次都会重新创建连接。

// connection.js

'use strict';
var mysql            = require('mysql');
var sys              = require('util');
var exec             = require('child_process').exec;
var config           = require('config');
var db_config        = {
    host              : config.get('databaseSettings.db_host'),
    user              : config.get('databaseSettings.db_user'),
    password          : config.get('databaseSettings.db_password'),
    database          : config.get('databaseSettings.database'),
    port              : config.get('databaseSettings.mysqlPORT'),
    multipleStatements: true,
    debug             : ['ComQueryPacket']
};
var restart          = function (callback) {
    console.log('RESTART THE SERVER');
    callback();
    //exec("whoami; pm2 restart dashboard;", callback);
};
var handleDisconnect = function () {
    connection = mysql.createConnection(db_config);
    console.log('\n\n\t--In the handleDisconnect from connection to DB\n');
    connection.connect(function (err) {
        if (err) {
            console.log('--DB CONNECTION ERROR - ');
            setTimeout(handleDisconnect, 2000);
        } else {
            console.log('connection variable created ');
        }
    });
    connection.on('error', function (err) {
        console.log('--DB CONNECTION ERROR - ');
        switch (err.code) {
            case 'PROTOCOL_CONNECTION_LOST':
                handleDisconnect();
                break;
            case 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR':
                restart();
                break;
            default:
                throw err;
        }
    });
};
handleDisconnect();

这样,我希望从该文件导出连接/池连接。

2 个答案:

答案 0 :(得分:3)

connection.js

var mysql = require('mysql');
var db_config = {
   //...
   connectTimeout: 10000 //The milliseconds before a timeout occurs during
                         //the initial connection to the MySQL server.
};
var pool  = mysql.createPool(db_config);

pool.getConnection(function(err, connection) {
  // connected! (unless `err` is set)
});

pool.on('error', function(err) {
  console.log(err.code); // 'ER_BAD_DB_ERROR' 
  // https://www.npmjs.com/package/mysql#error-handling
});

module.exports = pool;

otherfile.js

var db = require('./connection.js'); // db is pool

db.query('SELECT 12 AS number', function(err, rows, fields) {
  if (err) throw err;

  console.log('The number is: ', rows[0].solution);
});

答案 1 :(得分:0)

通常应该在调用node.js模块的生命周期中保持一个连接。也就是说,挂在你的var mysql上并重复使用它,直到模块终止(或直到​​你知道你不再需要它为止)。

你可以拥有一个"游泳池"但我建议你不要这样做,直到你找到它为止。如果/当你创建一个池时,我会建议10为connectionLimit。这个小到不成问题。需要更多的东西可能表明其他地方效率低下。 (常见问题是缺少良好的查询索引。)