從零開始學習nodejs(五)nodejs+express+mysql搭建後臺服務(下)

系列文章github項目地址(最終版):https://github.com/zliuyang1287/MyBlog

接上篇,雖然基本的服務器功能實現了,但是文件過於雜亂,因爲是邊學邊做,所以並沒有規範。現在既已知道各個文件作用,也瞭解了express框架的工作原理,現在就把文件整理一下。

首先最受不了的就是userDao文件,仔細觀察其實可以發現,每次操作數據庫的步驟是一樣的,這裏就可以抽取2個公共方法。一個是帶返回數據的查詢類方法,一個是插入修改刪除的方法。可以看到無論各種操作,變的東西只有sql和參數,所以直接抽象出兩個方法放到工具類下。爲防止工具類持續增多,這裏把util.js也幹掉,根據工具類型分好類
util文件目錄
在這裏插入圖片描述
DbUtil.js

// 獲取連接池
var pool = require('../conf/DbConf');
// 獲取json格式化工具類
var json = require('./JsonFormat');
// 執行增刪改通用方法
var executeSql = function (res, sql, param) {
    pool.getConnection(function (err, connection) {
        // 捕捉鏈接錯誤信息並返回
        if (err) {
            json.rtnError(res, "數據庫連接失敗:" + err.message);
            return;
        }
        // 執行sql語句,這裏是插入一條信息query一共有三個參數,第一個是sql語句。第二個是參數數組,一定要和數據庫的
        // 數據類型相對應,也要跟sql語句的佔位符相對應。第三個是回調函數,err代表訪問是否出錯,result代表本次訪問的回執信息
        connection.query(sql, param, function (err, result) {
            // 插入失敗,返回錯誤信息
            if (err) {
                json.rtnError(res, err.message);
                return;
            }
            // 插入成功返回操作成功,result可以自己打印看一下,當只做查詢時返回查詢到的數據,其他諸如增刪改操作返回的是一個
            // 對象,其中affectedRows就是受影響的行數,其餘的屬性可以自行打印看看
            if (result.affectedRows > 0) {
                json.rtnSuccess(res);
            }
            // 釋放連接,訪問數據庫完成一定要及時幹掉此次連接請求,不然一會你的數據庫就崩死了 
            connection.release();
        });
    });
};

// 數據查詢通用方法,param爲null表示無參數查詢
var queryData = function (res, sql, param) {
    pool.getConnection(function (err, connection) {
        if (err) {
            json.rtnError(res, "數據庫連接失敗:" + err.message);
            return;
        }
        if (param != null) {
            connection.query(sql, param, function (err, result) {
                if (err) {
                    json.rtnError(res, err.message);
                    return;
                }
                if (result) {
                    // 返回查詢結果
                    json.rtnObj(res, result);
                }
            });
        } else {
            connection.query(sql, function (err, result) {
                if (err) {
                    json.rtnError(res, err.message);
                    return;
                }
                if (result) {
                    // 返回查詢結果
                    json.rtnObj(res, result);
                }

            });
        }
        // 釋放連接
        connection.release();
    });
};
// 提供給dao用
module.exports = { executeSql, queryData };

JsonFormat.js

// 封裝返回消息
var rtnSuccess = function (res) {
    var obj = { "code": 0, "msg": "操作成功" }
    res.json(obj);
};
var rtnError = function (res, message) {
    var obj = { "code": 1, "msg": message }
    res.json(obj);
};
var rtnObj = function (res, data) {
    var obj = { "code": 1, "msg": "操作成功", "data": data }
    res.json(obj);
};


module.exports = { rtnError, rtnObj, rtnSuccess };

工具類修改完後,就要對應修改一下UserDao,優化一下邏輯處理,引入封裝好的數據庫操作工具,調用這裏的兩個方法代替原來的重複代碼
UserDao.js

// 實現與MySQL交互
// 獲取json格式化工具類
var json = require('../../util/JsonFormat');
// 獲取編寫好的sql語句
var sql = require('./User');
// 引入封裝好的數據庫操作工具
var db = require('../../util/DbUtils');
// 暴露方法給路由處調動
module.exports = {
	//增加
	add: function (req, res, next) {
		// 獲取前臺頁面傳過來的參數
		// ps:res和rsp有哪些屬性可以去菜鳥教程的express部分查看,或者我在文末附上
		var param = req.query || req.search;
		// 處理判斷參數傳遞的正確與否
		if(param.account==null || param.name==null || param.password==null){
			json.rtnError(res,'賬號、密碼、用戶名都必須填寫!');
			return;
		}
		// 條件正確執行插入
		db.executeSql(res,sql.insert,[param.account,param.password,param.name,new Date()]);
	},
	delete: function (req, res, next) {
		var id =req.query.id;
		if(id==null){
			json.rtnError(res,'未獲取到要刪除的信息!');
			return;
		}
		// 轉爲int因爲這裏數據庫的id類型是int,否則默認是string類型,會導致報錯
		db.executeSql(res,sql.delete,parseInt(id));
	},
	update: function (req, res, next) {
		// 根據id更新賬戶名、姓名信息
		var param = req.query;
		if(param.account == null || param.id == null || param.name == null) {
			json(res, '更新失敗!賬戶、用戶名、用戶id均不可爲空!');
			return;
		}
		db.executeSql(res,sql.update, [param.account, param.name, parseInt(param.id)]);
	},
	queryById: function (req, res, next) {
		var id = req.query.id; 
		if (id==null) {
			json.rtnError(res,"未獲取到要查詢的用戶id!");
			return;
		}
		db.queryData(res,sql.queryById,parseInt(id));
	},
	queryAll: function (req, res, next) {
		db.queryData(sql.queryAll, null);
	},
	updatePsd: function (req, res, next) {
		var param = req.query || req.search;
		if (param.id == null || param.password == null) {
			json.rtnError(res,"密碼修改失敗!");
			return;
		}
		db.executeSql(res,sql.updatePsd,[param.password,parseInt(param.id)]);
	}
};

明顯感覺清晰多了。

接下來要整理的就是路由了,首先路由必須從app.js拿出來,都放在裏面太臃腫。
app.js
這裏做如下修改

// 自己編寫的模塊
// 引入路由
var route = require('./routes/route');

// 設置路由,用於不同的頁面之間的切換判斷
route(app);

route.js
單獨處理路由配置,作爲所有路由的總入口

// 路由總配置
// 引入用戶路由
var user = require('./UserRoute');
//...還可以引入其他路由,按功能分組
var route = function(app){
    // 以user開頭,後面的增刪改查動作放到UserRoute,直接以add,delete體現出來,不用addUser,deleteUser之類
    app.use('/user', user);
}

module.exports = route;

UserRoute.js
這裏就是用戶下所有的功能子路由了,只存放用戶相關的

var express = require('express');
var router = express.Router();
// 引入數據庫的訪問方法,類比Java這裏就是注入Service
var userDao = require('../dao/user/UserDao');

//配置路由
// post就是post請求
router.post('/add', function(req, res, next) {
  // 調用userDao中的add方法
	userDao.add(req, res, next);
});
// get請求,習慣上數據添加修改都用post,查詢刪除用get
router.get('/delete', function(req, res, next) {
	userDao.delete(req, res, next);
});
router.post('/update', function(req, res, next) {
	userDao.update(req, res, next);
});
router.post('/updatePsd', function(req, res, next) {
	userDao.updatePsd(req, res, next);
});
router.get('/queryById', function(req, res, next) {
	userDao.queryById(req, res, next);
});
router.get('/queryAll', function(req, res, next) {
	userDao.queryAll(req, res, next);
});
module.exports = router;

以上就是全部的路由配置了。

完成路由優化後重新保存啓動,試一下效果,注意看路由
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
一切順利,別的功能就不試了

到此爲止這個後臺服務器整體好多了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章