1. 程式人生 > >node.js連接MySQL操作及註意事項

node.js連接MySQL操作及註意事項

creat 等等 pass 產生 函數返回 密碼 .com 原因 處理

node.js作為服務端的js運行環境已經出現了有幾年了,最近我有個朋友也在做這方面的開發,但是也是剛剛接觸,遇到了很多坑。前幾天他們在操作數據庫的時候出現了點問題,後來我們一起看了看,其實都是node本身機制的一些問題,這裏總結一下給新手做借鑒。

我朋友的數據庫采用的是MySQL。(至於為什麽不用mongoDB,這個是公司上層選型的結果,因為很多新手朋友似乎總是覺的node.js就是應該和mongoDB聯系在一起,所以這裏簡單說下)。我後來寫了一個簡單的小例子,整個小例子使用了express框架,node_modules裏面已經下載好了express和ejs模板。先來看下目錄:

技術分享

server.js =》 node.js的服務器啟動文件

db.js =》 數據庫操作文件

views =》 存放模板文件,也就是所有的頁面存放的地方

public =》 存放所有靜態資源的地方,比如css js images之類的

首先介紹一下node.js連接MySQL的步驟,第一步,需要安裝一個叫做MySQL的npm包,這個包是官方提供的,穩定性是可以保證的,當然,也還有其他的npm包,這裏我們只使用mysql包。安裝的方法很簡單了,輸入指令 npm install mysql --save,等待下載完成.技術分享

看到這個樣子,那就是安裝成功了。

然後我們打開db.js文件,在裏面寫入數據庫中操作必須的一些代碼,看下圖:

技術分享

代碼很少,意思也很明顯,第一步需要引入以mysql包,然後我們創建一個空對象,並且給他賦值一個叫query的方法,這個方法接受兩個參數,第一個參數是你查詢數據時候的sql語句,第二個參數是獲取查詢結果的回調函數。

再看函數內部,第一塊代碼是用來設置操作mysql的配置的:

技術分享

host表示mysql安裝的地址,因為我是本地的數據庫,所以直接使用localhost

user表示mysql的用戶名

password表示mysql的密碼

database表示你要選擇操作的具體的庫的名字

port表示端口,可不填,默認就是3306

mysql.createConnection的返回值connection是我們接下來操作mysql的一個具體的對象,所有的操作方法都是基於他的。

調用connection的connect方法判斷連接是否成功,如果失敗,則把錯誤信息打印出來,並且停止運行。

技術分享

調用connection的query方法來直接向數據庫發送sql語句,並且把用回調函數返回結果,其中回調函數中有三個參數,第一參數是錯誤對象,如果操作失敗,則會停止並打印錯誤信息,第二參數是具體的返回的結果,正常情況下是一個數組,裏面包含很多json,第三個參數也是一個數組,裏面包含著最每個數據的解釋,比如當前數據屬於哪個庫,那張表等等。我們使用最多的自然是第二個參數了

技術分享

當數據庫操作結束以後關閉連接

技術分享

整個過程很簡單,只是其中有兩個問題,第一個是數據庫連接丟失的問題,不知道有沒有人碰到過,第一次訪問首頁的時候,連接數據庫正常,第二次訪問首頁,數據庫連接不上了,會報錯說連接丟失。這個原因是我們每操作完一次數據庫就關閉了數據庫連接,再次訪問的時候就找不到連接了,但是連接又不能不關閉,有人可能覺得奇怪,每次訪問首頁時候都會訪問db.js文件,不是每次都會有一個新連接產生嗎?是的,只是我最開始的時候生成連接的那段代碼並沒有放到db.query的函數中,而是放在外面,如下圖:

技術分享

這樣就導致連接只生成一次,關閉了以後,第二采訪得不到連接。把它放在函數裏面以後,使用exports對外暴露接口。每次訪問首頁,都會重新走一遍創建連接的過程,每次都能拿到一個新的連接,這樣訪問就沒有問題了。其實項目中可以直接使用連接池。省去了很多麻煩。

第二個問題是我們在server.js中引入了db.js

技術分享

此時大家可能看到了,mysql.query有兩個參數,第一個是sql,第二個是回調函數,回調函數有一個result的參數,其實他就是數據庫查詢出來的結果。有人會說為什麽不直接在db.js中使用return,把查詢結果返回,搞什麽回調啊!

技術分享

其實這裏就是node.js的異步造成的一些問題了,如果我們把server.js中的代碼改成下圖

技術分享

因為我們看到了mysql包的query方法是異步操作,這就導致下面的res.render()方法不會等待他把結果查詢出來以後再執行,往往是結果還沒出來,就已經開始渲染頁面,但是數據又沒有得到,所以就會報錯了。因此只好傳送了一個回調函數進去,在mysql的query方法結束以後,把結果通過參數傳入到我們自己寫的回調函數中,這樣我們就能在回調函數裏得到結果了。然後再執行渲染。當然處理這個問題還可以引入第三方包 async來解決異步問題,具體看個人了。

node.js連接MySQL操作及註意事項