Node.js的MySQL基礎1——Express與MySQL聯調

0.目標

實現通過Node.js對MySQL進行數據CURD操作,這里將使用Node.js的Express框架。


1.前置條件

1.1 已經安裝了MySQL數據庫。

建議再安裝一個可視化操作工具MySQL Front

1.2 安裝Express和MySQL

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

2.重點

2.0 文件夾結構預覽

文件夾結構

整個應用的流程如下:

啟動app.js后,用戶在瀏覽器發出請求,調用routes對應的方法,從models中找到處理方法,從config獲取配置后對數據庫進行操作。

2.1 定義數據庫配置參數

這里先在config文件夾里創建一個db.js文件,導出一個名為onelib的數據庫鏈接配置。


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

注意,如果有多個數據庫,可以增加一個配置參數,和onelib并列。如:


module.exports = {
 onelib: {
 ……
 },
 newdb: {    // 新的數據庫配置
 ……
 }
};

2.2 設置數據庫連接

仍然在config文件夾中創建一個文件,名為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;

注意,如果有多個數據庫,只需要使用對應的配置(在db.js中定義的)信息即可設置多個數據庫連接,如:


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;

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

2.3 操作數據庫的模型

在數據庫配置完畢并建立連接后,即可對數據庫進行CURD操作。
我們在models文件夾中,創建一個名為tasks.js的文件,用來存儲對task模塊的操作:


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

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

Task.prototype.find = function(id, callback) {  // 增加一個方法,名為find,傳入參數為id和回調函數callback

 // sql查詢語句,注意這里的“?”號,它會在query的時候被處理
 var sql = "SELECT * FROM tasks WHERE id =?";
 
 // 獲取mysql的onelib_pool連接池,以回調的方式處理(即獲取成功后,執行下一步)
 mysql.onelib_pool.getConnection(function(err, connection) {
 if (err) {
 callback(true);
 return;
 }
 // 獲取成功后,執行query
 // 注意到這里有三個參數,第一個是sql語句,第二個是一個數組,第三個是回調函數
 // 需要著重說明的是第二個參數,它將依次替換sql里的“?”號
 // sql語句被替換后,會是這樣的:"SELECT * FROM tasks WHERE id = " + id
 connection.query(sql, [id], function(err, results) {
 if (err) {
 callback(true);
 return;
 }
 callback(false, results);
 });
 });
};

Hint1:如果我們要對newdb進行操作,則可以這樣寫:


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

Hint2:關于sql語句的填寫:

如果有多個參數要傳入,可以這么寫:


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

如果沒有參數要傳入,可以這么寫:


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

2.4 處理路由請求

在routes文件夾中創建一個文件:tasks.js。這個文件用來處理用戶的路由請求


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

// 根據taskid獲取任務數據
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+'的任務');
 }
 else if(undefined!=result){ // 增加這個判斷,否則在沒有查詢到的情況下(sql查詢出錯的情況下),Node.js會掛掉。當然,你也可以安裝supervisor,這樣即使掛掉了也會自動重啟。安裝指令為“npm install -g supervisor”,安裝完畢后,使用“supervisor app”來代替“node app”來啟動應用
 res.send(result.length === 1 ? result[0]:result);
 }
 else{
 res.end("Error");
 }
 });
}

Hint1:關于查詢結果的結構
查詢結果如果只有一個,會以對象的形式返回。查詢結果如果有多個,會以數組的形式把對象組合起來

Hint2:關于undefined的檢查
如果查詢結果result為undefined,而我們又對result取result[0],將導致出錯,Node.js會直接掛掉!

Hint3:對結果集進行解析
當前的代碼會將查詢結果直接以對象的形式輸出到頁面中,如果不是ajax的請求,這樣的輸出會unreadable;所以,我們有必要在輸出之前先對其進行“裝飾”。雖然這個是前端工程師的工作,但我們的目標是全棧工程師嘛。

2.5 映射路由到應用中

注意到,我們之前寫的方法全部是export的,即可以被外部調用的。我們把路由請求的處理也export了,目的是讓app.js文件更簡潔,路由的實現全部在routes文件夾里,而不會摻雜在app.js文件中。

下面給出app.js代碼


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

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

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

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

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

打開瀏覽器,輸入

http://127.0.0.1:3000/gettask/1

taskid為1的數據將顯示在網頁中(當然,你的數據庫里首先要有這個數據 ^ _ ^)


原創文章,未經許可,請勿轉載
作者:Mike的讀書季
日期:2016.08.08
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容