Node.js的MySQL基礎(chǔ)1——Express與MySQL聯(lián)調(diào)

0.目標(biāo)

實(shí)現(xiàn)通過Node.js對(duì)MySQL進(jìn)行數(shù)據(jù)CURD操作逢慌,這里將使用Node.js的Express框架。


1.前置條件

1.1 已經(jīng)安裝了MySQL數(shù)據(jù)庫(kù)般又。

建議再安裝一個(gè)可視化操作工具M(jìn)ySQL Front

1.2 安裝Express和MySQL

npm install express --save
npm install mysql --save

2.重點(diǎn)

2.0 文件夾結(jié)構(gòu)預(yù)覽

文件夾結(jié)構(gòu)

整個(gè)應(yīng)用的流程如下:

啟動(dòng)app.js后布隔,用戶在瀏覽器發(fā)出請(qǐng)求霎匈,調(diào)用routes對(duì)應(yīng)的方法趟济,從models中找到處理方法乱投,從config獲取配置后對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。

2.1 定義數(shù)據(jù)庫(kù)配置參數(shù)

這里先在config文件夾里創(chuàng)建一個(gè)db.js文件顷编,導(dǎo)出一個(gè)名為onelib的數(shù)據(jù)庫(kù)鏈接配置戚炫。


module.exports = {
 onelib: {
 host: '127.0.0.1',   // MySQL所在服務(wù)器IP
 user: 'root',        // 用戶名
 password: '',        // 密碼
 database:'onelib',   // 數(shù)據(jù)庫(kù)名稱
 port: 3306,          // 端口號(hào)
 dateStrings: true,   // 時(shí)間以字符串形式顯示,否則會(huì)有類似這樣的顯示:Thu Apr 14 2016 00:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間) 17:20:12
 }
};

注意媳纬,如果有多個(gè)數(shù)據(jù)庫(kù)双肤,可以增加一個(gè)配置參數(shù),和onelib并列层宫。如:


module.exports = {
 onelib: {
 ……
 },
 newdb: {    // 新的數(shù)據(jù)庫(kù)配置
 ……
 }
};

2.2 設(shè)置數(shù)據(jù)庫(kù)連接

仍然在config文件夾中創(chuàng)建一個(gè)文件杨伙,名為mysql.js其监。該文件用于建立與MySQL的連接萌腿。

var mysql = require('mysql'); // 引用mysql模塊。注意要先安裝mysql: npm install mysql
var config = require('./db');

var onelib_pool = mysql.createPool(config.onelib);
exports.onelib_pool = onelib_pool;

注意抖苦,如果有多個(gè)數(shù)據(jù)庫(kù)毁菱,只需要使用對(duì)應(yīng)的配置(在db.js中定義的)信息即可設(shè)置多個(gè)數(shù)據(jù)庫(kù)連接,如:


var mysql = require('mysql'); // 引用mysql模塊锌历。注意要先安裝mysql: npm install mysql
var config = require('./db');

// 數(shù)據(jù)庫(kù)連接
var onelib_pool = mysql.createPool(config.onelib);
exports.onelib_pool = onelib_pool;

// 新的數(shù)據(jù)庫(kù)連接
var newdb_pool = mysql.createPool(config. newdb);
exports. newdb_pool = newdb_pool;

2.3 操作數(shù)據(jù)庫(kù)的模型

在數(shù)據(jù)庫(kù)配置完畢并建立連接后贮庞,即可對(duì)數(shù)據(jù)庫(kù)進(jìn)行CURD操作。
我們?cè)趍odels文件夾中究西,創(chuàng)建一個(gè)名為tasks.js的文件窗慎,用來存儲(chǔ)對(duì)task模塊的操作:


var mysql = require('../config/mysql');// 獲取數(shù)據(jù)庫(kù)連接配置

var Task = function() {}; // 預(yù)定義一個(gè)空的類,接下來只需要往里增加方法即可

Task.prototype.find = function(id, callback) {  // 增加一個(gè)方法卤材,名為find遮斥,傳入?yún)?shù)為id和回調(diào)函數(shù)callback

 // sql查詢語(yǔ)句,注意這里的“?”號(hào)扇丛,它會(huì)在query的時(shí)候被處理
 var sql = "SELECT * FROM tasks WHERE id =?";
 
 // 獲取mysql的onelib_pool連接池术吗,以回調(diào)的方式處理(即獲取成功后,執(zhí)行下一步)
 mysql.onelib_pool.getConnection(function(err, connection) {
 if (err) {
 callback(true);
 return;
 }
 // 獲取成功后帆精,執(zhí)行query
 // 注意到這里有三個(gè)參數(shù)较屿,第一個(gè)是sql語(yǔ)句隧魄,第二個(gè)是一個(gè)數(shù)組,第三個(gè)是回調(diào)函數(shù)
 // 需要著重說明的是第二個(gè)參數(shù)隘蝎,它將依次替換sql里的“?”號(hào)
 // sql語(yǔ)句被替換后购啄,會(huì)是這樣的:"SELECT * FROM tasks WHERE id = " + id
 connection.query(sql, [id], function(err, results) {
 if (err) {
 callback(true);
 return;
 }
 callback(false, results);
 });
 });
};

Hint1:如果我們要對(duì)newdb進(jìn)行操作,則可以這樣寫:


Task.prototype.find = function(id, callback){
 ……
 mysql.newdb_pool.getConnection(function(err, connection) {
 ……
 });
};

Hint2:關(guān)于sql語(yǔ)句的填寫:

如果有多個(gè)參數(shù)要傳入末贾,可以這么寫:


var sql = "SELECT * FROM tasks WHERE releaser=? OR relative=?";
var sql_value_arr = [name, name]; // 對(duì)應(yīng)sql語(yǔ)句里的問號(hào)
……
connection.query(sql, sql_value_arr, function(err, results) {
 ……    
}

如果沒有參數(shù)要傳入闸溃,可以這么寫:


var sql = "SELECT * FROM tasks";
var sql_value_arr = [];
……
connection.query(sql, sql_value_arr, function(err, results) {
 ……    
}

2.4 處理路由請(qǐng)求

在routes文件夾中創(chuàng)建一個(gè)文件:tasks.js。這個(gè)文件用來處理用戶的路由請(qǐng)求


// 引用tasks模型
var Task = require('../models/tasks');

// 根據(jù)taskid獲取任務(wù)數(shù)據(jù)
exports.getTask = function(req, res) {
 var taskid = req.params.taskid;
 var task = new Task();
 task.find(taskid,function(err,result){
 if(err){
 res.send('沒有找到taskid為'+taskid+'的任務(wù)');
 }
 else if(undefined!=result){ // 增加這個(gè)判斷拱撵,否則在沒有查詢到的情況下(sql查詢出錯(cuò)的情況下)辉川,Node.js會(huì)掛掉。當(dāng)然拴测,你也可以安裝supervisor乓旗,這樣即使掛掉了也會(huì)自動(dòng)重啟。安裝指令為“npm install -g supervisor”集索,安裝完畢后屿愚,使用“supervisor app”來代替“node app”來啟動(dòng)應(yīng)用
 res.send(result.length === 1 ? result[0]:result);
 }
 else{
 res.end("Error");
 }
 });
}

Hint1:關(guān)于查詢結(jié)果的結(jié)構(gòu)
查詢結(jié)果如果只有一個(gè),會(huì)以對(duì)象的形式返回务荆。查詢結(jié)果如果有多個(gè)妆距,會(huì)以數(shù)組的形式把對(duì)象組合起來

Hint2:關(guān)于undefined的檢查
如果查詢結(jié)果result為undefined,而我們又對(duì)result取result[0]函匕,將導(dǎo)致出錯(cuò)娱据,Node.js會(huì)直接掛掉!

Hint3:對(duì)結(jié)果集進(jìn)行解析
當(dāng)前的代碼會(huì)將查詢結(jié)果直接以對(duì)象的形式輸出到頁(yè)面中盅惜,如果不是ajax的請(qǐng)求中剩,這樣的輸出會(huì)unreadable;所以抒寂,我們有必要在輸出之前先對(duì)其進(jìn)行“裝飾”结啼。雖然這個(gè)是前端工程師的工作,但我們的目標(biāo)是全棧工程師嘛屈芜。

2.5 映射路由到應(yīng)用中

注意到郊愧,我們之前寫的方法全部是export的,即可以被外部調(diào)用的井佑。我們把路由請(qǐng)求的處理也export了属铁,目的是讓app.js文件更簡(jiǎn)潔,路由的實(shí)現(xiàn)全部在routes文件夾里毅糟,而不會(huì)摻雜在app.js文件中红选。

下面給出app.js代碼


var express = require('express')
  , path = require('path')
  , task = require('./routes/tasks');
var app = express();

/* 主頁(yè) */
app.get('/', function(req, res){
  res.sendfile('views/index.html');
});

/* 處理路由請(qǐng)求 */
// Onelib
app.get('/gettask/:taskid',task.getTask);
// newdb
app.get('/gettask/:taskid',task.getTask);

/* 設(shè)置靜態(tài)文件路徑 */
app.use(express.static(path.join(__dirname, 'public')));

/* 啟動(dòng)服務(wù)器 */
var server = app.listen(3000, function(){
 
 var host = server.address().address;
 var port = server.address().port;
 
 console.log("*** OneLib智庫(kù)已啟動(dòng),訪問地址為 http://%s:%s", host, port)
});

打開瀏覽器姆另,輸入

http://127.0.0.1:3000/gettask/1

taskid為1的數(shù)據(jù)將顯示在網(wǎng)頁(yè)中(當(dāng)然喇肋,你的數(shù)據(jù)庫(kù)里首先要有這個(gè)數(shù)據(jù) ^ _ ^)


原創(chuàng)文章坟乾,未經(jīng)許可,請(qǐng)勿轉(zhuǎn)載
作者:Mike的讀書季
日期:2016.08.08
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝶防,一起剝皮案震驚了整個(gè)濱河市甚侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间学,老刑警劉巖殷费,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異低葫,居然都是意外死亡详羡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嘿悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实柠,“玉大人,你說我怎么就攤上這事善涨≈涎危” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵钢拧,是天一觀的道長(zhǎng)蟹漓。 經(jīng)常有香客問我,道長(zhǎng)源内,這世上最難降的妖魔是什么葡粒? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮姿锭,結(jié)果婚禮上塔鳍,老公的妹妹穿的比我還像新娘伯铣。我一直安慰自己呻此,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布腔寡。 她就那樣靜靜地躺著焚鲜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪放前。 梳的紋絲不亂的頭發(fā)上忿磅,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音凭语,去河邊找鬼葱她。 笑死,一個(gè)胖子當(dāng)著我的面吹牛似扔,可吹牛的內(nèi)容都是我干的吨些。 我是一名探鬼主播搓谆,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豪墅!你這毒婦竟也來了泉手?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偶器,失蹤者是張志新(化名)和其女友劉穎斩萌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏轰,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颊郎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霎苗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭艺。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叨粘,靈堂內(nèi)的尸體忽然破棺而出猾编,到底是詐尸還是另有隱情,我是刑警寧澤升敲,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布答倡,位于F島的核電站,受9級(jí)特大地震影響驴党,放射性物質(zhì)發(fā)生泄漏瘪撇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一港庄、第九天 我趴在偏房一處隱蔽的房頂上張望倔既。 院中可真熱鬧,春花似錦鹏氧、人聲如沸渤涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)实蓬。三九已至,卻和暖如春吊履,著一層夾襖步出監(jiān)牢的瞬間安皱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工艇炎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酌伊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓缀踪,卻偏偏與公主長(zhǎng)得像居砖,于是被迫代替她去往敵國(guó)和親燕锥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理悯蝉,服務(wù)發(fā)現(xiàn)归形,斷路器,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停鼻由,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,189評(píng)論 22 257
  • Chapter01.簡(jiǎn)介 NodeJS是讓JavaScript脫離瀏覽器運(yùn)行在服務(wù)器的一個(gè)平臺(tái)暇榴,不是語(yǔ)言。 Nod...
    JunChow520閱讀 954評(píng)論 0 9
  • 什么是卵巢囊腫 卵巢囊腫屬于卵巢腫瘤類的一種,各種年齡都有可能會(huì)患病狠轻,但以20-50歲的女性最為多見奸例。卵巢腫瘤是女...
    hfhshksh閱讀 314評(píng)論 0 0
  • 萬(wàn)善浮橋 在古義烏江上,東江橋是當(dāng)之無愧的第一橋向楼。除此查吊,佛堂的萬(wàn)善橋應(yīng)為第二橋了。 ...
    朱慶平閱讀 939評(píng)論 0 1