(原創)node.js入門之二:mysql的使用-Mac環境開發

本文地址:http://blog.csdn.net/z040145/article/details/50425562

0:開篇廢話

上一章手把手跟大家完成了Mac環境下nodejs的安裝,以及webstorm的安裝和使用,我們已經建立了自己的工程,可以在html上通過jquery的post請求,或者iOS上通過afnetworking/ASIHttpRequest來訪問我們的服務器http://localhost:3000完成數據交互。
顯然簡單的數據處理滿足不了一款真正應用,一個數據庫顯然是必須的。今天我們就瞭解一下nodejs裏mysql的簡單使用。今天的目標是完成Mac電腦中mysql的安裝,nodejs的mysql依賴,以及通過nodejs完成mysql的數據交互。這是一整套東西,還是一整套的來說吧。
ps:不要被命令行弄暈啦,百度一下 命令行大全,mysql命令行大全,vi操作命令行大全。
pps:以前Linux下做mysql開發,用了phpmyadmin,那個舒爽,現在Mac下開發mysql還沒找到合適的工具,那就命令行吧,就當熟悉熟悉mysql基礎命令了:)

一:開發環境

1. Mac電腦:系統版本10.11.1 
2. node版本:node-v5.2.0 
3. 開發工具:webstorm 10.0.4 
4. 瀏覽器:Chrome 42.0.2311.152 (64-bit) 
5. mysql:mysql-5.7.10-osx10.10-x86_64

二:Mac下mysql的安裝

老規矩,直接去官網下載,不會出妖蛾子,放心免費噠!
官網http://dev.mysql.com/downloads/mysql/
這裏寫圖片描述
還是老規矩,下載最新的,放心這種軟件的新版本不會出問題!注意下載dmg的,方便快捷,用Mac的親們都懂的!下載好就直接打開安裝,各種繼續各種同意就行啦!
打開系統便好設置:
這裏寫圖片描述
開啓MySQL,爲了方便,可以勾選下面的自動啓動服務:
這裏寫圖片描述
完成啦?驗證一下我們的mysql是否正確安裝,命令行敲起來吧!
這裏寫圖片描述
進入這個界面,表示我們的mysql就安裝完畢了!
ps:工程需要一些數據做測試用,就在這了用命令做一些操作練習練習吧:
1. 創建一個database
2. 創建一個table
3. 插入2行數據

三:nodejs的mysql依賴

打開終端,使用ls查看當前文件夾內容,cd進入文件夾。一直進入到自己工程目錄(能ls查看到package.json),然後輸入“npm install mysql“,安裝nodejs的mysql依賴。
安裝完成之後,查看WebStorm的工程目錄-》node_modules
這裏寫圖片描述
ok,安裝成功!我們的項目可以連接mysql啦!

四:mysql在nodejs中的使用

看看官方推薦怎麼說:https://github.com/felixge/node-mysql

var mysql = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;

  console.log('The solution is: ', rows[0].solution);
});

connection.end();

解析:
1. var mysql = require(‘mysql’); 引入mysql模塊
2. var connection =… ;設置參數
3. connection.connect(); 連接數據庫
4. connection.query;執行數據庫操作並執行回調,有err則拋出異常,控制檯輸出結果
5. connection.end(); 結束連接
基本的一個連接就是這樣了,十分的好理解。可以根據自己項目需要,做一些調整,封裝接口,異常處理等等。不作爲這篇入門來說。

五:一個例子

  1. 首先介紹一下我的MVC架構
    走到這一步,我們的開發條件已經都滿足了,可以開始按自己想法去構建框架,書寫代碼了。本部分是我對工程的架構調整,跟上一篇文章一樣,運用MVC思想重新架構nodejs工程。由於能力有限,可能有的地方還有問題,跳過本部分也可,歡迎指正!
    這裏寫圖片描述
    - bin: config目錄,各種參數的設置。
    - bin-》dbConfig.js: 工程數據庫設置,設置mysql的連接,host user password等信息。
    - controller: 控制器C目錄,處理各個方法接口的邏輯。
    - model: M目錄,完成數據庫連接和數據處理。
    - node_modules: node的庫目錄。
    - public:靜態文件目錄。存放上傳或下載的圖片視頻等資源。在web應用中,可以存放模版,可以存放html js等靜態資源。在app應用中,只用來存放文件資源。
  2. 栗子:
    目標:前端發出請求,傳遞參數到服務器,路由分配請求到C層目錄文件做邏輯處理,通過M層完成數據庫交互,C層返回數據給請求,前端展示數據。
    數據庫,建立庫,建立表,插入兩行數據:
    這裏寫圖片描述
    前端用html,當頁面加載完成時,調用js文件:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <link rel="shortcut icon" href="../favicon.ico" />
    <title>首頁</title>
    <script type="text/javascript" src="../javascripts/jquery-1.11.3.js"></script>
    <script type="text/javascript" src="../javascripts/indexJS.js"></script>
    <script>
        $(document).ready(getUsers);
    </script>
</head>
<body>
    <table id="user_table">
        <tr>
            <td>編號</td>
            <td>名字</td>
            <td>性別</td>
        </tr>
    </table>
</body>
</html>

indexJS.js:

/**
 * Created by zhangke on 15/12/28.
 */
var serverHttp = "http://localhost:3000/";

function getUsers (){
    //pageIndex要有邏輯來設置變量
    $.post(serverHttp+"getUsers",{"pageIndex":"1"},function(rs){
        /*rs結果:
        {
        status: true,
        users: [
                { id: 1, name: 'littleA', sex: 1 },
                { id: 2, name: 'littleB', sex: 0 } ]
        }
        */
        if (rs.status){
            if (rs.users.length){
                for(var i=0;i<rs.users.length;i++){
                    var sex = rs.users[i].sex==1?"男":"女";
                    var html = '<tr>' +
                        '<td>'+rs.users[i].id+'</td>' +
                        '<td>'+rs.users[i].name+'</td>' +
                        '<td>'+sex+'</td>' +
                        '</tr>';
                    $("#user_table").append(html);
                }
            }else{
                $("body").html("沒有信息");
            }
        }else {
            $("body").html("查詢失敗");
        }
    });
}

app.js,引入UserController,路由分配:

var users = require('./controller/UserController');
app.use('/getUsers', users.getUsers);

dbConfig.js,mysql參數設置:

/**
 * Created by zhangke on 15/12/31.
 */
var mysql = require('mysql');

exports.db_connect = function () {
    var db_connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : 'your password',
        database : 'you created'
        //debug    : 'true' //打開試試看?
    });
    return db_connection;
};

UserController.js:

/**
 * Created by zhangke on 15/12/30.
 */

var UserModel = require('../model/UserModel');
exports.getUsers = function(req, res) {
    console.log(req.body);
    var pageIndex = req.body.pageIndex;
    UserModel.getUsersMethod((pageIndex-1)*10,pageIndex*10,function(rs){
        console.log('rs::::::',rs);
        res.send(rs);
    });
};

UserModel.js,連接mysql,完成數據交互,回調給Controller:

/**
 * Created by zhangke on 15/12/31.
 */
var db_connection = require('../bin/dbConfig').db_connect();
db_connection.connect();

exports.getUsersMethod = function(limitA,limitB,rs){
    db_connection.query('select * from user limit '+limitA+','+limitB, function(err, rows, fields) {
        //console.log('getUsersMethod result is:', rows);
        if (err) {
            //輸出錯誤信息,返回status爲false
            //throw err;
            console.log("getUsersMethod err:"+err);
            rs({status:false});
        }else {
            rs({status:true,users:rows});
        }
    });
};

OK!代碼書寫完畢,檢查成果:
打開瀏覽器,輸入http://localhost:3000/html/index.html
這裏寫圖片描述
完成! 撒花!!! 慶祝!!!
麻麻再也不用擔心我只會前端不會服務器啦!!!

-=-=-=-=-=-=-=-=-=--=-=-=YD的分割線-=-=-=-=-=-=-=-=-=--=-=-=

錯誤總結:

1. mysql安裝完成後,輸入命令”mysql -u root -p”錯誤,提示”command not found”
路徑問題,我們需要先設置一下mysql命令的路徑,本文中的”PATH=”$PATH”:/usr/local/mysql/bin”是本次指定,如果想完成默認設置,百度一下啦。

2. You must reset your password using ALTER USER statement before executing this statement.
第一次安裝mysql,進入mysql後,輸入命令會被告知”You must reset your password using ALTER USER statement before executing this statement.”意思是讓用戶替換密碼。

3. npm install mysql錯誤
這裏寫圖片描述
提示package.json找不到,因爲npm安裝依賴,是對於工程目錄來說的,所以我們要先進入工程目錄,當前目錄下有這裏寫圖片描述 這個文件纔可以安裝mysql依賴。

4. 前端接收返回值爲空,但是控制檯有正確結果輸出
可能是因爲res.send的書寫位置不對,因爲非阻塞式工作原理,數據庫的交互是異步完成的,所以這邊還在數據交互呢,那邊早都發出去res.send了。完成複雜的多model調用時,需要使用代理來完成,當所有結果得到之後再進行數據返回,百度nodejs proxy研究吧。入門篇明白原理就好。

UserModel.getUsersMethod((pageIndex-1)*10,pageIndex*10,function(rs){
        console.log('rs::::::',rs);
        res.send(rs);
    });//res.send要等結果再發送。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章