nodejs筆記--mysql篇(四)

來源:互聯網
上載者:User

標籤:

測試連接

var mysql  = require(‘mysql‘);  //調用MySQL模組//建立一個connectionvar connection = mysql.createConnection({       host     : ‘localhost‘,       //主機  user     : ‘root‘,               //MySQL認證使用者名稱  password : ‘‘,        //MySQL認證使用者密碼  port: ‘3306‘,                   //連接埠號碼}); //建立一個connectionconnection.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);  });  //關閉connectionconnection.end(function(err){    if(err){                return;    }      console.log(‘[connection end] succeed!‘);});

 

參數

要想建立一個資料庫連接,先就要認識清楚Options   host:主機地址 (預設:localhost)  user:使用者名稱  password:密碼  port:連接埠號碼 (預設:3306)  database:資料庫名  charset:串連字元集(預設:‘UTF8_GENERAL_CI‘,注意字元集的字母都要大寫)  localAddress:此IP用於TCP串連(可選)  socketPath:串連到unix域路徑,當使用 host 和 port 時會被忽略  timezone:時區(預設:‘local‘)  connectTimeout:連線逾時(預設:不限制;單位:毫秒)  stringifyObjects:是否序列化對象(預設:‘false‘ ;與安全相關https://github.com/felixge/node-mysql/issues/501)  typeCast:是否將列值轉化為本地JavaScript類型值 (預設:true)  queryFormat:自訂query語句格式化方法 https://github.com/felixge/node-mysql#custom-format  supportBigNumbers:資料庫支援bigint或decimal類型列時,需要設此option為true (預設:false)  bigNumberStrings:supportBigNumbers和bigNumberStrings啟用 強制bigint或decimal列以JavaScript字串類型返回(預設:false)  dateStrings:強制timestamp,datetime,data類型以字串類型返回,而不是JavaScript Date類型(預設:false)  debug:開啟調試(預設:false)  multipleStatements:是否許一個query中有多個MySQL語句 (預設:false)  flags:用於修改串連標誌,更多詳情:https://github.com/felixge/node-mysql#connection-flags  ssl:使用ssl參數(與crypto.createCredenitals參數格式一至)或一個包含ssl設定檔名稱的字串,目前只捆綁Amazon RDS的設定檔

 

建立資料庫

CREATE DATABASE IF NOT EXISTS nodesample CHARACTER SET UTF8;USE nodesample;SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS `userinfo`;CREATE TABLE `userinfo` (  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主鍵‘,  `UserName` varchar(64) NOT NULL COMMENT ‘使用者名稱‘,  `UserPass` varchar(64) NOT NULL COMMENT ‘使用者密碼‘,  PRIMARY KEY (`Id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘使用者資訊表‘;

sql

{    insert:‘INSERT INTO user(id, name, age) VALUES(0,?,?)‘,    update:‘update user set name=?, age=? where id=?‘,    delete: ‘delete from user where id=?‘,    queryById: ‘select * from user where id=?‘,    queryAll: ‘select * from user‘}

Nodejs 調用帶out參數的預存程序,並得到out參數傳回值

建立一個帶out參數的預存程序 P_UserInfo-- ------------------------------ Procedure structure for `P_UserInfo`-- ----------------------------DROP PROCEDURE IF EXISTS `P_UserInfo`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `P_UserInfo`(IN ExtId INT,IN ExtUserName VARCHAR(64),IN ExtUserPass VARCHAR(64),OUT ExtReturnVal INT)TOP: BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTION    BEGIN        ROLLBACK;        SET ExtReturnVal = 0;  -- Failed    END;START TRANSACTION;        INSERT INTO userinfo(Id,UserName,UserPass) VALUES(ExtId,ExtUserName,ExtUserPass);                SET ExtReturnVal = 1;        SELECT ExtReturnVal;        COMMIT;END;;DELIMITER ;
調用var mysql  = require(‘mysql‘);  var connection = mysql.createConnection({       host     : ‘localhost‘,         user     : ‘root‘,                password : ‘‘,         port: ‘3306‘,                     database: ‘nodesample‘  }); connection.connect();var  userProc = ‘call P_UserInfo(?,?,?,@ExtReturnVal);‘;var userProc_Params = [0,‘finder‘,‘abcd‘];//調用預存程序connection.query(userProc,userProc_Params,function (err, retsult) {        if(err){            console.log(‘[EXEC PROC ERROR] - ‘,err.message);            return;        }               console.log(‘--------------------------PROC----------------------------‘);       console.log(retsult);              console.log(retsult[0][0].ExtReturnVal);       console.log(‘-----------------------------------------------------------------\n\n‘);  });connection.end();

結束資料庫連接兩種方法和區別

  end()

  end()方法在queries都結束後執行,end()方法接收一個回呼函數,queries執行出錯,仍然後結束串連,錯誤會返回給回呼函數err參數,可以在回呼函數中處理!

  destory()

  比較暴力,沒有回呼函數,即刻執行,不管queries是否完成!

串連池Pooling connections

1.串連池的建立,使用createPool方法,options和createConntion一致,可以監聽connection事件。

var mysql = require(‘mysql‘);//建立串連池var pool  = mysql.createPool({  host     : ‘192.168.0.200‘,  user     : ‘root‘,  password : ‘abcd‘});//監聽connection事件pool.on(‘connection‘, function(connection) {      connection.query(‘SET SESSION auto_increment_increment=1‘); });

串連池可以直接使用,也可以共用一個串連或管理多個串連(引用官方樣本)

//直接使用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)});

其它串連池配置選項

  waitForConnections

當串連池沒有串連或超出最大限制時,設定為true且會把串連放入隊列,設定為false會返回error

  connectionLimit

串連數限制,預設:10

  queueLimit

最大串連請求隊列限制,設定為0表示不限制,預設:0

釋放

  調用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     : ‘localhost‘,         user     : ‘root‘,                password : ‘‘,         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();

 

其它

1.escape轉義,防止SQL注入

var mysql = require(‘mysql‘);var pool = mysql.createPool({    host: ‘localhost‘,         user: ‘root‘,    password:‘‘,    port:‘3306‘,    database:‘nodesample‘});pool.getConnection(function(err,connection){        connection.query(‘SELECT * FROM userinfo WHERE id = ‘ + ‘5 OR ID = 6‘,function(err,result){        //console.log(err);        console.log(result);        connection.release();    });    connection.query(‘SELECT * FROM userinfo WHERE id = ‘ + pool.escape(‘5 OR ID = 6‘) ,function(err,result){        //console.log(err);        console.log(result);        connection.release();    });})

  2.mysql.escapeId(identifier)

  如果不能信任由使用者提示的SQL標識符(資料庫名,列名,表名),可以使用此方法,官方提供有樣本(最常見的是通過列名來排序什麼的...)   

  3.mysql.format

  準備查詢,該函數會選擇合適的轉義方法轉義參數

    ....

  還有一些安全相關的方法可以自行查看一下官方說明

 

nodejs筆記--mysql篇(四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.