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