《在 Node.js 中使用 MySQL & MySQL JavaScript 客戶端》要點:
本文介紹了在 Node.js 中使用 MySQL & MySQL JavaScript 客戶端,希望對您有用。如果有疑問,可以聯系我們。
相關主題:node.js web開發
NoSQL 數據庫最近一段時間都是很受追捧的,也許已經是 Node.js 應用程序的首選后端了.不過,你不應該只是根據潮流來選擇拿什么技術構建下一個項目,使用什么數據庫類型要取決于項目的特定需求.如果你的項目涉及到動態表的創建,實時的插入等等,那么 NoSQL 便是不錯的技術路線,而另一方面,如果項目中要處理復雜的查詢和事務,那么 SQL 數據庫就更加合適了.
在本教程中,我們會向你介紹如何使用 MySQL 模塊 - 這是一個用 JavaScript 編寫的運行在 Node.js 之上的 MySQL 驅動程序.我會向你解釋如何使用該模塊連接到 MySQL 數據庫,執行常規的 CRUD 操作,之后便是對存儲的過程進行檢查,以及對用戶的輸入進行轉義這些技術.
這個頗受歡迎的教程在 2017 年 11 月 07 日進行了更新.其中的修改包括將語法更新到了 ES6,辦理了node-mysql 模塊被重新命名的問題,增加了更多對初學者友好的文字說明,并在 ORM 上新增加了一個部分.
快速入門:如安在Node 中使用MySQL
也許你來這是便是為了找到一個快速的法門.如果你是想用盡可能少的時間在 Node 中啟動并運行 MySQL,我們能滿足你的需求!
以下5個簡單步驟告訴你如安在 Node 中使用 MySQL:
創立一個新項目:mkdir mysql-test && cd mysql-test
創立一個 package.json 文件:npm init -y
安裝mysql模塊: npm install mysql –save
創立一個app.js文件并將下面的代碼段復制進去.
運行該文件: node app.js.會看到一條 “Connected!”(已連接上了)消息.
安裝 mysql 模塊
現在讓我們細化到第一步.首先,我們使用命令行創建一個新目錄進進入這個目錄.然后我們使用 npm init -y 命令創建 package.json 文件.-y 參數表現 npm 會使用默認值而不會問你各種問題.
這一步假設你已經在系統上安裝了 Node 和 npm.如果還沒安裝,請閱讀 SitePoint 上的這篇文章,它會指導你:使用 nvm 安裝 Node.js 的多個版本.
然后,我們從 npm 安裝 mysql 模塊并將其保留為項目的依賴項.項目的 dependencies (相對于 dev-dependencies) 是運行程序所需要的包.你可以閱讀了解兩者的區別.
如果你深入學習使用 npm,可以閱讀這個指南,或者在我們的論壇上提問.
入門
在我們連接到數據庫之前,有一件重要的事情就是要在你的機器上安裝和配置 MySQL.如果這件事情還沒做完,那就看看軟件主頁上的安裝說明本身去裝一個吧.
接下來我們需要做的就是創建一個數據庫和一個數據庫表.你可以使用一個圖形用戶界面來做到這一點,好比說 phpMyAdmin,或者就使用命令行. 對于我們這篇文章,使用的是一個名為 sitepoint 的數據庫和一個名為 employees 的表.如果你希望跟著一起操作的話,這里有一個數據庫的轉儲文件,方便你可以快速地啟動并運行起來:
連接到數據庫
現在,我們在 mysql-test 目錄下創立一個名為 app.js 的文件,來看看如何從 Node.js 連接到 MySQL.
現在打開一個終端并輸入 node app.js.在連接成功建立之后,你應該能夠在控制臺中看到“Connection established”(連接已經建立好了)這條消息了. 如果出現了什么問題(例如輸入了錯誤的暗碼),程序就會觸發一個回調,該事件會傳遞出一個 JavaScript Error 對象(err)的實例. 你可以嘗試將其打印到控制臺以查看其中包含的有用信息以調試程序.
使用 Grunt 來監視文件的變動
每當我們對代碼進行更改時,手動運行 node app.js 命令會變得有點乏味,所以讓我們來把這個操作自動化吧. 這一節并不必要跟本教程的其余部分并沒有依賴關系,不過如果照著做的話肯定會為你節省一些麻煩事兒.
我們首先得安裝幾個包:
Grunt 是有名的 JavaScript 任務執行程序,每當監聽到有文件發生修改時,grunt-contrib-watch 都會運行已經預定義好的任務,而且會使用 grunt-execute 來運行 node app.js 命令.
安裝完成之后,在項目根中創立一個名為Gruntfile.js的文件,然后在里面添加上如下代碼.
現在運行 grunt watch 然后改動一下 app.js 文件.Grunt 就應該會檢測到我們改動了文件并重新運行 node app.js 命令.
執行查詢
讀取
現在你知道如安在 Node.js 中建立 MySQL 連接了,再來看看如何執行 SQL 查詢.我們從這里開始:建立使用 createConnection 命令連接到名為 sitepoint 的數據庫.
連接建立后我們要使用連接變量來對數據庫中的 employees 表進行查詢.
現在運行 app.js (通過 grunt-watch 或者在終端輸入 node app.js),你可以看到終端輸出從數據庫返回的數據.
從 MySQL 數據庫返回的數據可以通過遍歷 rows 工具來進行解析.
創立
你可以在數據庫中執行 insert 查詢,像這樣:
請注意到我們是如何通過回調參數來得到剛插入那條記錄的 ID 的.
更新
類似地,在執行 update 查詢的時候,通過 result.affectedRows 可獲得受影響的行數:
刪除
delete 查詢的操作也差不多:
高檔用法
我希望有方法通過 mysql 模塊來處理存儲過程,以及轉義用戶輸入.
存儲過程
簡單的說,存儲過程是存儲在數據庫中,可以由數據庫引擎和連接上數據的程序語言調用的程序(例如,SQL 程序).如果你必要復習,請看看這篇不錯的文章.
先來為我們的 sitepoint 數據庫創建一個存儲過程,它用于獲取所有員工的詳情.我們把它命名為 sp_getall.為了做這件事,你必要某種數據庫接操作界面.我使用 phpMyAdmin.在 sitepoint 數據庫中運行下面的查詢:
它會將程序保留在 information_schema 數據庫的 ROUTINGS 表中.
下一步,建立連接并使用連接對象挪用存儲過程,像這樣:
保留修改并運行.運行的時候你可以看到從數據庫返回的數據.
這些數據包含一些附加信息,比如影響的行數,insertId 等.你需要對返回數據的第 0 個元素進行遍歷以獲取員工詳情信息.
現在考慮一個必要輸入參數的存儲過程.
我們可以在挪用存儲過程的時候傳入參數:
多數時候,如果我們想在數據庫中插入一條記錄,必要將插入記錄的 ID 作為輸出參數返回出來.考慮接下來用于插入數據的存儲過程,它有一個輸出參數:
為了調用含有輸出參數的存儲過程,我們必要在創建連接時調用多個程序.因此,修改連接,設置執行多個語句為 true.
然后在挪用存儲過程的時候,設置并傳入一個輸出參數.
在上面的代碼中,我們設置了輸出參數 @employee_id 并在調用存儲過程的時候將其傳入.一旦調用完成,我們必要使用 select 查詢輸出參數來獲取返回的 ID.
運行 app.js.如果執行勝利你可以看到 select 查詢的輸出參數和各種其它信息.通過 rows[2] 可獲得輸出參數的值.
轉義用戶輸入
為了避免 SQL 注入進擊,你應該總是轉義來自用戶的任何數據,然后再把它用于 SQL 查詢.來演示一下為什么:
這看起來并沒有什么問題,它會返回正確的成果:
不外,如果我們將 userLandVariable 改為:
居然拜訪了整個數據集.如果我們再改為這樣:
這下麻煩年夜了!
好消息是有方法處理這類問題.你只需要使用 mysql.escape 方法:
或者使用問號占位符,就像我們在文章一開始提到的那個示例一樣:
為什么不簡單地使用 ORM?
你可能注意到了,評論中有人建議使用 ORM.在詳述這個辦法的優缺點之前,我先看看 ORM 是什么.下面是來自 Stack Overflow 的回答.
對象關系映射(Object-Relational Mapping, ORM) 是一種允許人們使用面向對象范型來查詢和操作數據庫數據的技術.在談到 ORM 的時候,多半人是指實現了 ORM 技術的某個庫,所以會使用 “an ORM” 這樣的短語.
因此,這種辦法基本上意味著你會使用 ORM 領域相關的語言來編寫數據庫邏輯,而不是我們一直在討論的普通辦法.下面以 Sequelize 為例:
對照:
使用 ORM 對你是否有意義,取決于很多與你工作相關的因素,好比你在做什么以及為誰做.一方面,ORM 的形式使開發更為高效,從某種程序上來說,它抽象了大部分的 SQL 因而不需要團隊中的每個人都去了解如何編寫高效的數據庫查詢.它也很容易遷移到不同的數據庫軟件,因為你是在抽象層次上進行開發.
然而,從另一方面來說,由于不理解 ORM 是如何做的,所以可能會編寫出一些混亂和低效的 SQL.性能也會是一個大問題,究竟優化不通過 ORM 的查詢要容易得多.
到底采用哪一種辦法,決定權在你,但是如果正在做這個決定,請看看這個 Stack Overflow 的帖子:為什么應該使用 ORM?,以及 SitePoint 上的:你可能不知道的 3 個 JavaScript ORM.
小結
本教程中只涉及到了 MySQL 客戶端的皮毛.我保舉你去閱讀官方文檔以了解更詳細的信息.當然也有別的選擇,比如 node-mysql2 和 node-mysql-libmysqlclient.
你是否已經在 Node.js 中用過這些庫來連接到 MySQL?我很想聽人說說這些庫.請在下面的評論中奉告我們你的想法、建議以及更正意見!
文章來源:開源中國
【燈塔大數據】微信公眾號介紹:中國電信北京研究院通過整合電信自有數據、互聯網數據和線下數據,創立了業內領先的“燈塔”大數據行業應用平臺,致力于與行業合作伙伴共同打造大數據行業應用生態圈.目前我們面向市場研究、廣告、汽車、金融、人力資源等諸多行業領域,提供零售研究、消費者研究、店鋪選址、精準營銷、泛義征信等服務,助力企業在大數據時代楊帆遠航.
微信公眾號【燈塔年夜數據】關鍵字信息:
【人工智能】獲取人工智能時代的成長思考 ppt
【半月刊】下載年夜數據瞭望半月刊
【網絡平安】獲取國民網絡平安報告全文
【23個理由】下載《年夜數據讓你興奮的23個理由》電子書
【思維導圖】下載12種對象的獲取方式
【 燈塔 】 查看更多癥結字回復
《在 Node.js 中使用 MySQL & MySQL JavaScript 客戶端》是否對您有啟發,歡迎查看更多與《在 Node.js 中使用 MySQL & MySQL JavaScript 客戶端》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7142.html