一、安裝
npm install mysql
二、引入模塊,并連接mysql
varmysql? =require('mysql');//調(diào)用MySQL模塊//創(chuàng)建一個connectionvarconnection = mysql.createConnection({host:'127.0.0.1',//主機(jī)user? ? :'root',//MySQL認(rèn)證用戶名password :'abcd',//MySQL認(rèn)證用戶密碼port:'3306',//端口號database:'school',//數(shù)據(jù)庫名稱});//創(chuàng)建一個connectionconnection.connect(function(err){if(err){console.log('[query] - :'+err);return;? ? }console.log('[connection connect]? succeed!');});//執(zhí)行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);? });//關(guān)閉connectionconnection.end(function(err){if(err){return;? ? }console.log('[connection end] succeed!');});
test->插入數(shù)據(jù)
varmysql? =require('mysql');varconnection = mysql.createConnection({host:'192.168.0.200',user:'root',password:'abcd',port:'3306',database:'nodesample', }); connection.connect();varuserAddSql ='INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)';varuserAddSql_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();
從執(zhí)行結(jié)果可以看出,result中包含一些有用的信息,affectedRows(受影響的行數(shù))insertId(插入的主鍵ID)等等。
有受影響的行數(shù)和插入數(shù)據(jù)的ID,就可以很方便進(jìn)行后續(xù)的一些操作(比如判斷是否成功或者繼續(xù)根據(jù)插入數(shù)據(jù)的ID進(jìn)行其它操作)
test->查詢數(shù)據(jù)
varmysql? =require('mysql');varconnection = mysql.createConnection({host:'192.168.0.200',user:'root',password:'abcd',port:'3306',database:'nodesample', }); connection.connect();varuserGetSql ='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();
從查詢出來的結(jié)果可以看出,result返回了一個JSON格式的數(shù)據(jù)
三、結(jié)束數(shù)據(jù)庫連接兩種方法和區(qū)別
前面的示例中我在結(jié)尾處都會調(diào)用一個connection.end()方法,這個方法connection.connect()對應(yīng),一個開始,一個結(jié)束!
結(jié)束連接其實(shí)有兩種方法end(),destory();
end()
end()方法在queries都結(jié)束后執(zhí)行,end()方法接收一個回調(diào)函數(shù),queries執(zhí)行出錯,仍然后結(jié)束連接,錯誤會返回給回調(diào)函數(shù)err參數(shù),可以在回調(diào)函數(shù)中處理!
destory()
比較暴力,沒有回調(diào)函數(shù),即刻執(zhí)行,不管queries是否完成!
四、連接池Pooling connections(生產(chǎn)環(huán)境請使用連接池)
1.連接池的創(chuàng)建,使用createPool方法,options和createConntion一致,可以監(jiān)聽connection事件。
varmysql =require('mysql');//創(chuàng)建連接池varpool? = mysql.createPool({host:'192.168.0.200',user:'root',password:'abcd'});
連接池可以直接使用,也可以共享一個連接或管理多個連接(引用官方示例)
//直接使用pool.query('SELECT 1 + 1 AS solution',function(err, rows, fields){if(err)throwerr;console.log('The solution is: ', rows[0].solution);});//共享pool.getConnection(function(err, connection){// connected! (unless `err` is set)});
3.釋放
調(diào)用connection.release()方法,會把連接放回連接池,等待其它使用者使用!
varmysql =require('mysql');varpool? = 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();? ? });});
五、斷線重連
數(shù)據(jù)庫可以因?yàn)楦鞣N原因?qū)е逻B接不上,這種就必須有重連接機(jī)制!
主要判斷errorcode:PROTOCOL_CONNECTION_LOST
varmysql =require('mysql');vardb_config = {host:'192.168.0.200',user:'root',password:'abcd',port:'3306',database:'nodesample'};varconnection;functionhandleDisconnect(){? connection = mysql.createConnection(db_config);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? connection.connect(function(err){if(err) {console.log("進(jìn)行斷線重連:"+newDate());? ? ? 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{throwerr;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? });}handleDisconnect();
作者:victor
鏈接:http://www.itdecent.cn/p/e875856a588a
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。