免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
在 Node.js 中使用 MySQL & MySQL JavaScript 客戶端


NoSQL 數(shù)據(jù)庫(kù)最近一段時(shí)間都是很受追捧的,也許已經(jīng)是 Node.js 應(yīng)用程序的首選后端了。不過(guò),你不應(yīng)該只是根據(jù)潮流來(lái)選擇拿什么技術(shù)構(gòu)建下一個(gè)項(xiàng)目,使用什么數(shù)據(jù)庫(kù)類型要取決于項(xiàng)目的特定需求。如果你的項(xiàng)目涉及到動(dòng)態(tài)表的創(chuàng)建,實(shí)時(shí)的插入等等,那么 NoSQL 就是不錯(cuò)的技術(shù)路線,而另一方面,如果項(xiàng)目中要處理復(fù)雜的查詢和事務(wù),那么 SQL 數(shù)據(jù)庫(kù)就更加合適了。

在本教程中,我們會(huì)向你介紹如何使用 MySQL 模塊 - 這是一個(gè)用 JavaScript 編寫的運(yùn)行在 Node.js 之上的 MySQL 驅(qū)動(dòng)程序。我會(huì)向你解釋如何使用該模塊連接到 MySQL 數(shù)據(jù)庫(kù),執(zhí)行常規(guī)的 CRUD 操作,之后就是對(duì)存儲(chǔ)的過(guò)程進(jìn)行檢查,以及對(duì)用戶的輸入進(jìn)行轉(zhuǎn)義這些技術(shù)。

這個(gè)頗受歡迎的教程在 2017 年 11 月 07 日進(jìn)行了更新。其中的修改包括將語(yǔ)法更新到了 ES6,解決了node-mysql 模塊被重新命名的問(wèn)題,增加了更多對(duì)初學(xué)者友好的文字說(shuō)明,并在 ORM 上新增加了一個(gè)部分。


快速入門:如何在Node 中使用MySQL


也許你來(lái)這是就是為了找到一個(gè)快速的法門。如果你是想用盡可能少的時(shí)間在 Node 中啟動(dòng)并運(yùn)行 MySQL,我們能滿足你的需求!

以下5個(gè)簡(jiǎn)單步驟告訴你如何在 Node 中使用 MySQL:

  1. 創(chuàng)建一個(gè)新項(xiàng)目:mkdir mysql-test && cd mysql-test

  2. 創(chuàng)建一個(gè) package.json 文件:npm init -y

  3. 安裝mysql模塊: npm install mysql –save

  4. 創(chuàng)建一個(gè)app.js文件并將下面的代碼段復(fù)制進(jìn)去。

  5. 運(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ù)表示 npm 會(huì)使用默認(rèn)值而不會(huì)問(wèn)你各種問(wèn)題。

這一步假設(shè)你已經(jīng)在系統(tǒng)上安裝了 Node 和 npm。如果還沒(méi)安裝,請(qǐng)閱讀 SitePoint 上的這篇文章,它會(huì)指導(dǎo)你:使用 nvm 安裝 Node.js 的多個(gè)版本。

然后,我們從 npm 安裝 mysql 模塊并將其保存為項(xiàng)目的依賴項(xiàng)。項(xiàng)目的 dependencies (相對(duì)于 dev-dependencies) 是運(yùn)行程序所需要的包。你可以閱讀了解兩者的區(qū)別

如果你深入學(xué)習(xí)使用 npm,可以閱讀這個(gè)指南,或者在我們的論壇上提問(wèn)。


入門


在我們連接到數(shù)據(jù)庫(kù)之前,有一件重要的事情就是要在你的機(jī)器上安裝和配置 MySQL。如果這件事情還沒(méi)做完,那就看看軟件主頁(yè)上的安裝說(shuō)明自己去裝一個(gè)吧。

接下來(lái)我們需要做的就是創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)和一個(gè)數(shù)據(jù)庫(kù)表。你可以使用一個(gè)圖形用戶界面來(lái)做到這一點(diǎn),比如說(shuō) phpMyAdmin,或者就使用命令行。 對(duì)于我們這篇文章,使用的是一個(gè)名為 sitepoint 的數(shù)據(jù)庫(kù)和一個(gè)名為 employees 的表。如果你希望跟著一起操作的話,這里有一個(gè)數(shù)據(jù)庫(kù)的轉(zhuǎn)儲(chǔ)文件,方便你可以快速地啟動(dòng)并運(yùn)行起來(lái):




連接到數(shù)據(jù)庫(kù)


現(xiàn)在,我們?cè)?mysql-test 目錄下創(chuàng)建一個(gè)名為 app.js 的文件,來(lái)看看如何從 Node.js 連接到 MySQL。


現(xiàn)在打開(kāi)一個(gè)終端并輸入 node app.js。在連接成功建立之后,你應(yīng)該能夠在控制臺(tái)中看到“Connection established”(連接已經(jīng)建立好了)這條消息了。 如果出現(xiàn)了什么問(wèn)題(例如輸入了錯(cuò)誤的密碼),程序就會(huì)觸發(fā)一個(gè)回調(diào),該事件會(huì)傳遞出一個(gè) JavaScript Error 對(duì)象(err)的實(shí)例。 你可以嘗試將其打印到控制臺(tái)以查看其中包含的有用信息以調(diào)試程序。

使用 Grunt 來(lái)監(jiān)視文件的更改

每當(dāng)我們對(duì)代碼進(jìn)行更改時(shí),手動(dòng)運(yùn)行 node app.js 命令會(huì)變得有點(diǎn)乏味,所以讓我們來(lái)把這個(gè)操作自動(dòng)化吧。 這一節(jié)并不需要跟本教程的其余部分并沒(méi)有依賴關(guān)系,不過(guò)如果照著做的話肯定會(huì)為你節(jié)省一些麻煩事兒。

我們首先得安裝幾個(gè)包:


Grunt 是有名的 JavaScript 任務(wù)執(zhí)行程序,每當(dāng)監(jiān)聽(tīng)到有文件發(fā)生修改時(shí),grunt-contrib-watch 都會(huì)運(yùn)行已經(jīng)預(yù)定義好的任務(wù),并且會(huì)使用 grunt-execute 來(lái)運(yùn)行 node app.js 命令。

安裝完成之后,在項(xiàng)目根中創(chuàng)建一個(gè)名為Gruntfile.js的文件,然后在里面添加上如下代碼。


現(xiàn)在運(yùn)行 grunt watch 然后修改一下 app.js 文件。Grunt 就應(yīng)該會(huì)檢測(cè)到我們修改了文件并重新運(yùn)行 node app.js 命令。


執(zhí)行查詢


讀取

現(xiàn)在你知道如何在 Node.js 中建立 MySQL 連接了,再來(lái)看看如何執(zhí)行 SQL 查詢。我們從這里開(kāi)始:建立使用 createConnection 命令連接到名為 sitepoint 的數(shù)據(jù)庫(kù)。


連接建立后我們要使用連接變量來(lái)對(duì)數(shù)據(jù)庫(kù)中的 employees 表進(jìn)行查詢。

現(xiàn)在運(yùn)行 app.js (通過(guò) grunt-watch 或者在終端輸入 node app.js),你可以看到終端輸出從數(shù)據(jù)庫(kù)返回的數(shù)據(jù)。

從 MySQL 數(shù)據(jù)庫(kù)返回的數(shù)據(jù)可以通過(guò)遍歷 rows 對(duì)象來(lái)進(jìn)行解析。

創(chuàng)建

你可以在數(shù)據(jù)庫(kù)中執(zhí)行 insert 查詢,像這樣:


請(qǐng)注意到我們是如何通過(guò)回調(diào)參數(shù)來(lái)獲得剛插入那條記錄的 ID 的。

更新

類似地,在執(zhí)行 update 查詢的時(shí)候,通過(guò) result.affectedRows 可得到受影響的行數(shù):


刪除

delete 查詢的操作也差不多:



高級(jí)用法


我希望有辦法通過(guò) mysql 模塊來(lái)處理存儲(chǔ)過(guò)程,以及轉(zhuǎn)義用戶輸入。

存儲(chǔ)過(guò)程

簡(jiǎn)單的說(shuō),存儲(chǔ)過(guò)程是存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以由數(shù)據(jù)庫(kù)引擎和連接上數(shù)據(jù)的程序語(yǔ)言調(diào)用的程序(例如,SQL 程序)。如果你需要復(fù)習(xí),請(qǐng)看看這篇不錯(cuò)的文章

先來(lái)為我們的 sitepoint 數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,它用于獲取所有員工的詳情。我們把它命名為 sp_getall。為了做這件事,你需要某種數(shù)據(jù)庫(kù)接操作界面。我使用 phpMyAdmin。在 sitepoint 數(shù)據(jù)庫(kù)中運(yùn)行下面的查詢:


它會(huì)將程序保存在 information_schema 數(shù)據(jù)庫(kù)的 ROUTINGS 表中。

下一步,建立連接并使用連接對(duì)象調(diào)用存儲(chǔ)過(guò)程,像這樣:

保存修改并運(yùn)行。運(yùn)行的時(shí)候你可以看到從數(shù)據(jù)庫(kù)返回的數(shù)據(jù)。

這些數(shù)據(jù)包括一些附加信息,比如影響的行數(shù),insertId 等。你需要對(duì)返回?cái)?shù)據(jù)的第 0 個(gè)元素進(jìn)行遍歷以獲取員工詳情信息。

現(xiàn)在考慮一個(gè)需要輸入?yún)?shù)的存儲(chǔ)過(guò)程。

我們可以在調(diào)用存儲(chǔ)過(guò)程的時(shí)候傳入?yún)?shù):

多數(shù)時(shí)候,如果我們想在數(shù)據(jù)庫(kù)中插入一條記錄,需要將插入記錄的 ID 作為輸出參數(shù)返回出來(lái)??紤]接下來(lái)用于插入數(shù)據(jù)的存儲(chǔ)過(guò)程,它有一個(gè)輸出參數(shù):

為了調(diào)用含有輸出參數(shù)的存儲(chǔ)過(guò)程,我們需要在創(chuàng)建連接時(shí)調(diào)用多個(gè)程序。因此,修改連接,設(shè)置執(zhí)行多個(gè)語(yǔ)句為 true。

然后在調(diào)用存儲(chǔ)過(guò)程的時(shí)候,設(shè)置并傳入一個(gè)輸出參數(shù)。

在上面的代碼中,我們?cè)O(shè)置了輸出參數(shù) @employee_id 并在調(diào)用存儲(chǔ)過(guò)程的時(shí)候?qū)⑵鋫魅?。一旦調(diào)用完成,我們需要使用 select 查詢輸出參數(shù)來(lái)獲取返回的 ID。

運(yùn)行 app.js。如果執(zhí)行成功你可以看到 select 查詢的輸出參數(shù)和各種其它信息。通過(guò) rows[2] 可獲得輸出參數(shù)的值。

轉(zhuǎn)義用戶輸入

為了避免 SQL 注入攻擊,你應(yīng)該總是轉(zhuǎn)義來(lái)自用戶的任何數(shù)據(jù),然后再把它用于 SQL 查詢。來(lái)演示一下為什么:

這看起來(lái)并沒(méi)有什么問(wèn)題,它會(huì)返回正確的結(jié)果:

不過(guò),如果我們將 userLandVariable 改為:

居然訪問(wèn)了整個(gè)數(shù)據(jù)集。如果我們?cè)俑臑檫@樣:

這下麻煩大了!

好消息是有辦法處理這類問(wèn)題。你只需要使用 mysql.escape 方法:

或者使用問(wèn)號(hào)占位符,就像我們?cè)谖恼乱婚_(kāi)始提到的那個(gè)示例一樣:


為什么不簡(jiǎn)單地使用 ORM?


你可能注意到了,評(píng)論中有人建議使用 ORM。在詳述這個(gè)方法的優(yōu)缺點(diǎn)之前,我先看看 ORM 是什么。下面是來(lái)自 Stack Overflow 的回答。

對(duì)象關(guān)系映射(Object-Relational Mapping, ORM) 是一種允許人們使用面向?qū)ο蠓缎蛠?lái)查詢和操作數(shù)據(jù)庫(kù)數(shù)據(jù)的技術(shù)。在談到 ORM 的時(shí)候,多數(shù)人是指實(shí)現(xiàn)了 ORM 技術(shù)的某個(gè)庫(kù),所以會(huì)使用 “an ORM” 這樣的短語(yǔ)。

因此,這種方法基本上意味著你會(huì)使用 ORM 領(lǐng)域相關(guān)的語(yǔ)言來(lái)編寫數(shù)據(jù)庫(kù)邏輯,而不是我們一直在討論的普通方法。下面以 Sequelize 為例:


對(duì)比:

使用 ORM 對(duì)你是否有意義,取決于很多與你工作相關(guān)的因素,比如你在做什么以及為誰(shuí)做。一方面,ORM 的形式使開(kāi)發(fā)更為高效,從某種程序上來(lái)說(shuō),它抽象了大部分的 SQL 因而不需要團(tuán)隊(duì)中的每個(gè)人都去了解如何編寫高效的數(shù)據(jù)庫(kù)查詢。它也很容易遷移到不同的數(shù)據(jù)庫(kù)軟件,因?yàn)槟闶窃诔橄髮哟紊线M(jìn)行開(kāi)發(fā)。

然而,從另一方面來(lái)說(shuō),由于不理解 ORM 是如何做的,所以可能會(huì)編寫出一些混亂和低效的 SQL。性能也會(huì)是一個(gè)大問(wèn)題,畢竟優(yōu)化不通過(guò) ORM 的查詢要容易得多。

到底采用哪一種方法,決定權(quán)在你,但是如果正在做這個(gè)決定,請(qǐng)看看這個(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 中用過(guò)這些庫(kù)來(lái)連接到 MySQL?我很想聽(tīng)人說(shuō)說(shuō)這些庫(kù)。請(qǐng)?jiān)谙旅娴脑u(píng)論中告訴我們你的想法、建議以及更正意見(jiàn)!


更多干貨請(qǐng)前往公眾號(hào)菜單欄“戳我”->“干貨分享”查看。



本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java開(kāi)發(fā)環(huán)境之ElasticSearch
Liblog首頁(yè)、文檔和下載
《Node js項(xiàng)目實(shí)戰(zhàn)》06TF物業(yè)服務(wù)端商品管理功能
2021 年 Node.js 開(kāi)發(fā)人員學(xué)習(xí)路線圖
Node.js 安全指南
ERPNEXT 安裝
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服