美文网首页
nodejs连接mysql

nodejs连接mysql

作者: 流过 | 来源:发表于2018-07-19 20:09 被阅读0次

    一、安装

    npm install mysql
    

    二、引入模块,并连接mysql

    var mysql  = require('mysql');  //调用MySQL模块
    
    //创建一个connection
    var connection = mysql.createConnection({     
      host     : '127.0.0.1',       //主机
      user     : 'root',               //MySQL认证用户名
      password : 'abcd',        //MySQL认证用户密码
      port: '3306',                   //端口号
      database: 'school',                   //数据库名称
    }); 
    //创建一个connection
    connection.connect(function(err){
        if(err){        
              console.log('[query] - :'+err);
            return;
        }
          console.log('[connection connect]  succeed!');
    });  
    //执行SQL语句
    connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { 
         if (err) {
                 console.log('[query] - :'+err);
            return;
         }
         console.log('The solution is: ', rows[0].solution);  
    });  
    //关闭connection
    connection.end(function(err){
        if(err){        
            return;
        }
          console.log('[connection end] succeed!');
    });
    
    ---test->插入数据
    var mysql  = require('mysql');  
    
    var connection = mysql.createConnection({     
      host     : '192.168.0.200',       
      user     : 'root',              
      password : 'abcd',       
      port: '3306',                   
      database: 'nodesample', 
    }); 
    
    connection.connect();
    
    var  userAddSql = 'INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)';
    var  userAddSql_Params = ['Wilson', 'abcd'];
    //增
    connection.query(userAddSql,userAddSql_Params,function (err, result) {
            if(err){
             console.log('[INSERT ERROR] - ',err.message);
             return;
            }        
    
           console.log('--------------------------INSERT----------------------------');
           //console.log('INSERT ID:',result.insertId);        
           console.log('INSERT ID:',result);        
           console.log('-----------------------------------------------------------------\n\n');  
    });
    
    connection.end();
    

    从执行结果可以看出,result中包含一些有用的信息,affectedRows(受影响的行数) insertId(插入的主键ID)等等。
    有受影响的行数和插入数据的ID,就可以很方便进行后续的一些操作(比如判断是否成功或者继续根据插入数据的ID进行其它操作)

    ---test->查询数据
    var mysql  = require('mysql');  
    
    var connection = mysql.createConnection({     
      host     : '192.168.0.200',       
      user     : 'root',              
      password : 'abcd',       
      port: '3306',                   
      database: 'nodesample', 
    }); 
    
    connection.connect();
    
    var  userGetSql = 'SELECT * FROM userinfo';
    //查
    connection.query(userGetSql,function (err, result) {
            if(err){
              console.log('[SELECT ERROR] - ',err.message);
              return;
            }        
    
           console.log('--------------------------SELECT----------------------------');
           console.log(result);        
           console.log('-----------------------------------------------------------------\n\n');  
    });
    
    connection.end();
    

    从查询出来的结果可以看出,result返回了一个JSON格式的数据


    三、结束数据库连接两种方法和区别

    前面的示例中我在结尾处都会调用一个connection.end()方法,这个方法connection.connect()对应,一个开始,一个结束!

    结束连接其实有两种方法

    end(),destory();
    

    end()方法在queries都结束后执行,end()方法接收一个回调函数,queries执行出错,仍然后结束连接,错误会返回给回调函数err参数,可以在回调函数中处理!

    destory()方法比较暴力,没有回调函数,即刻执行,不管queries是否完成!


    四、连接池Pooling connections(生产环境请使用连接池)

    1.连接池的创建,使用createPool方法,optionscreateConntion一致,可以监听connection事件。

    var mysql = require('mysql');
    
    //创建连接池
    var pool  = mysql.createPool({
      host     : '192.168.0.200',
      user     : 'root',
      password : 'abcd'
    });
    

    2.连接池可以直接使用,也可以共享一个连接或管理多个连接(引用官方示例)

    //直接使用
    pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
      if (err) throw err;
    
      console.log('The solution is: ', rows[0].solution);
    });
    
    //共享
    pool.getConnection(function(err, connection) {
      // connected! (unless `err` is set)
    });
    

    3.释放

    调用connection.release()方法,会把连接放回连接池,等待其它使用者使用!

    var mysql = require('mysql');
    
    var pool  = mysql.createPool({
      host     : '192.168.0.200',       
      user     : 'root',              
      password : 'abcd',       
      port: '3306',                   
      database: 'nodesample'  
    });
    
    pool.getConnection(function(err, connection) {
    
        connection.query( 'SELECT * FROM userinfo;', function(err, result) {    
            console.log(result);
            connection.release();
        });
    
        connection.query( 'SELECT * FROM userinfo;', function(err, result) {
            
            console.log(result);
            connection.release();
    
        });
    });
    

    五、断线重连

    数据库可以因为各种原因导致连接不上,这种就必须有重连接机制!
    主要判断errorcode:PROTOCOL_CONNECTION_LOST

    var mysql = require('mysql');
    var db_config = {
      host     : '192.168.0.200',       
      user     : 'root',              
      password : 'abcd',       
      port: '3306',                   
      database: 'nodesample'  
    };
    
    var connection;
    function handleDisconnect() {
      connection = mysql.createConnection(db_config);                                               
      connection.connect(function(err) {              
        if(err) {                                     
          console.log("进行断线重连:" + new Date());
          setTimeout(handleDisconnect, 2000);   //2秒重连一次
          return;
        }         
         console.log("连接成功");  
      });                                                                           
      connection.on('error', function(err) {
        console.log('db error', err);
        if(err.code === 'PROTOCOL_CONNECTION_LOST') { 
          handleDisconnect();                         
        } else {                                      
          throw err;                                 
        }
      });
    }
    handleDisconnect();
    

    相关文章

      网友评论

          本文标题:nodejs连接mysql

          本文链接:https://www.haomeiwen.com/subject/rwhxmftx.html