系列文章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;
以上就是全部的路由配置了。
完成路由優化後重新保存啓動,試一下效果,注意看路由
一切順利,別的功能就不試了
到此爲止這個後臺服務器整體好多了