Db.js數據庫連接模塊
const mysql = require("mysql");
const dbConfig = {
host: "localhost",
port: 3306,
user: "root",
password: "",
database: "數據庫"
}
const to = require("./awaitTo");
class Db {
static connect(){ // 數據庫連接的動作
this.con = mysql.createConnection(dbConfig);
this.con.connect();
}
static operator(sqlStr){ // 此方法利用Promise把數據庫的執行sql語句的異步代碼封裝進去
return new Promise((resolve, reject) => {
this.con.query(sqlStr, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
})
})
}
static async query(sqlStr){ // static修飾的方式裏的this, 指向的是類
return await to(this.operator(sqlStr));
}
}
module.exports = Db; // 導出當前封裝的Db工具類
awaitTo.js模塊
function to(promise) {
let p = promise.then(data => [null, data])
.catch(err => [err, undefined]);
return p;
}
module.exports = to;
Result.js模塊
// 定義統一的返回接口的數據對象格式, 方便前端統一處理判斷
function underline2Hump(s) {
return s.replace(/_(\w)/g, function (all, letter) {
return letter.toUpperCase()
})
}
// xxx_axx 轉 xxxAxx 下劃線_轉駝峯方法
// 注意嵌套問題 (所以需要遞歸)
const jsonToHump = (obj) => {
if (obj instanceof Array) { // instanceof 判斷左側對象是否是右側類的實例出來的對象 跟typeof 類似
obj.forEach(function (v, i) {
jsonToHump(v) // 處理數組裏每一項
})
} else if (obj instanceof Object) {
Object.keys(obj).forEach(function (key) { // Object.keys(obj) 取出所有此對象所有的key返回一個數組
var newKey = underline2Hump(key) // 把下劃線的key轉成駝峯連接
if (newKey !== key) { // 證明一個是駝峯一個還是下劃線, 所以進入, 刪除下劃線的key, 添加駝峯的key然後賦值.
obj[newKey] = obj[key]
delete obj[key]
}
jsonToHump(obj[newKey]) // 如果對象key對應的value還是一個對象, 那麼所有需要調用在判斷
})
} // 因爲如果value既不是對象也不是數組, 沒有必要再進入遞歸了
}
/**
* 完全成功
* list 數據
* msg 提示文字
* code: 自定義一個前端判斷狀態的數字
*/
// exports.a = 1 和module.exports = {a: 1}相等
exports.Success = (list = [], msg = '恭喜你, 操作成功') => {
// 轉成駝峯標識
jsonToHump(list) // 注意: 對象是引用關係, 所以傳參是淺複製, 下面返回的還是同一個處理後的引用的數組/對象
return {
msg,
code: 200,
list
}
}
// 參數正確, 但是權限不夠
exports.Guest = (msg = '權限非法') => {
return {
msg,
code: 403
}
}
// 參數錯誤,請檢查傳遞的參數
exports.MError = (msg = '參數等發生錯誤') => {
return {
msg,
code: 500
}
}