1. 程式人生 > >MySQL基礎1——Express與MySQL聯調.md

MySQL基礎1——Express與MySQL聯調.md

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){ // 增加這個判斷,否則在沒有查詢到的情況下,Node.js會掛掉
            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的資料將顯示在網頁中(當然,你的資料庫裡首先要有這個資料 ^ _ ^)

 **原創文章,未經許可,請勿轉載**
 作者:林曉州
 日期:2016.05.17
 QQ:1139904786
 Blog:http://blog.csdn.net/kkdestiny

 參考文件:http://www.tuicool.com/articles/UZzeyuy