標籤:
測試連接
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篇(四)