【轉】Nodejs學習筆記(四)--- 與MySQL互動(felixge/node-mysql)

來源:互聯網
上載者:User

標籤:width   超出   character   connected   address   簡單   資料   事件   roc   

目錄
  • 簡介和安裝
  • 測試MySQL
  • 認識一下Connection Options
  • MYSQL CURD
    • 插入
    • 更新
    • 查詢
    • 刪除
  • Nodejs 調用帶out參數的預存程序,並得到out參數傳回值
  • 結束資料庫連接兩種方法和區別
  • 串連池Pooling connections
    • 建立
    • 其它串連池配置選項
    • 釋放
    • 使用樣本
  • 斷線重連
  • 其它...
簡介和安裝

  Node.js與MySQL互動操作有很多庫,具體可以在 https://www.npmjs.org/search?q=mysql  查看。

  我選擇了felixge/node-mysql,用的人比較多,先隨大溜看看它的使用,暫時沒有太過糾結於各庫之間的執行效能問題,對其它庫有研究的筒子也可以分享一下效能要求較高時的選擇^_^! 

  

  地址:https://github.com/felixge/node-mysql

       https://www.npmjs.org/package/mysql

This is a node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed

  用純JavaScript實現。MIT 100%!

 

  安裝

npm install mysql

    

  注意:安裝前先把目錄cd到node.exe所在目錄下,這樣執行安裝命令時,會找到目錄下node_modules,並安裝在此目錄下,否則使用mysql時,你會出現 Error: Cannot find module ‘mysql‘ 

測試MySQL

  MySQL版本:5.5

  在官方樣本的基礎下修改一下並測試:

   

 測試樣本源碼

  成功執行!

認識一下Connection Options

  要想建立一個資料庫連接,先就要認識清楚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的設定檔

 

  其它:

  可以使用URL形式的加接字串,不多介紹了,不太喜歡那種格式,覺得可讀性差,也易出錯,想瞭解的可以去首頁上看。

MYSQL CURD

   首先建立一個測試資料庫nodesample,在資料庫中建一個userinfo表

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=‘使用者資訊表‘;

  1.向UserInfo表中插入一條資料

  

 插入樣本源碼

從執行結果可以看出,result中包含一些有用的資訊,affectedRows(受影響的行數) insertId(插入的主鍵ID)等等。。。

有受影響的行數和插入資料的ID,就可以很方便進行後續的一些操作(比如判斷是否成功或者繼續根據插入資料的ID進行其它操作)

  下面,我去資料庫伺服器中使用Navicate for MySQL工具查詢一下UserInfo表

   

  插入成功!

  2.更新1操作中插入的資料資訊

  

 更新樣本源碼

  從返回受影響行數來看,更新應該是正確的,下面我們用一個SELECT查詢樣本去驗證更新是否成功!

  3.查詢

  

 查詢樣本源碼

從查詢出來的結果可以看出,result返回了一個JSON格式的資料,同時表示第二步中更新是成功!

  4.刪除

  

 刪除樣本源碼

  去資料庫伺服器裡查詢看一下

  

查詢userinfo表中已沒有資料,刪除成功!

   

  到此Node.js結合MySQL的增、刪、改、查操作應會部完成了!

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

  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 ;

  下面,來寫個樣本來調用

   

 調用預存程序得到out參數樣本源碼

  去資料為中看一下

  

在表中正確插入此資料,而且正確的得到了out參數的值,細心的可能會發現我預存程序中在SET ExtReturnVal = 1表示成功後,多了一句SELECT ExtReturnVal;

這樣就可以通地查詢得到out參數的值了!(有別的方法可以分享一下^_^!)

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

  前面的樣本中我在結尾處都會調用一個connection.end()方法,這個方法connection.connect()對應,一個開始,一個結束!

  結束串連其實有兩種方法end(),destory();

  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)});

  2.其它串連池配置選項

  waitForConnections

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

  connectionLimit

   串連數限制,預設:10

  queueLimit

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

  3.釋放

  調用connection.release()方法,會把串連放回串連池,等待其它使用者使用!

  4.使用樣本

  

 串連池使用樣本源碼

 

  在實際開發過程中,應該還是使用串連池的方式比較好!

斷線重連

  資料庫可以因為各種原因導致串連不上,這種就必須有重串連機制!

  主要判斷errorcode:PROTOCOL_CONNECTION_LOST 

  1.首先去資料庫伺服器停止MySQL服務

  

  2.運行斷線重連代碼

  

代碼中在error事件中,判斷返回errorcode是否為:PROTOCOL_CONNECTION_LOST ,如果是用setTimeout定時2秒重連!

從執行結果可以看出,大約2-3秒會輸出重連輸出資訊,不斷在嘗試重新串連!

  3.去資料為伺服器,開啟mysql伺服器,再看看執行結果

  

當資料庫伺服器mysql服務重新啟動後,執行結果輸出串連成功,不再輸出斷線重連日誌^_^!

 斷線重連樣本源碼其它...

  1. escape()

  防止SQL注入,可以使用pool.escape()和connect.escape(),不多說了,自已可以試試,我提供一個樣本

  

 escape() 樣本源碼

結果可以看出,第1個query拼接條件可以被執行,而通過escape方法轉義後的忽略了後面的拼接的部分!

大家可以看到我前面用的?佔位的方式,簡單的試了一下,好處並沒有這種危險,這裡就不提供樣本了,在我上面提供的代碼上改一下就可以試出來^_^!

  2.mysql.escapeId(identifier)

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

  3.mysql.format

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

    ....

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

 

  本次也未講到串連池叢集,以後有時間再把這次漏掉的一些補一篇當提高篇吧,現在基礎的和MySQL互動應該問題不大了^_^!

  

 

【轉】Nodejs學習筆記(四)--- 與MySQL互動(felixge/node-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.