【敏捷开发】Node.js(nodejs)实现一个接口完成增删改查聚合接口4个功能,最大限度节省接口数量,正所谓“一口多用”(基础版、免登陆、无鉴权)
生活随笔
收集整理的這篇文章主要介紹了
【敏捷开发】Node.js(nodejs)实现一个接口完成增删改查聚合接口4个功能,最大限度节省接口数量,正所谓“一口多用”(基础版、免登陆、无鉴权)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
注意,前情提示:
本代碼基于《Node.js(nodejs)對本地JSON文件進行增、刪、改、查操作(輕車熟路)》
傳送門Node.js(nodejs)對本地JSON文件進行增、刪、改、查操作(輕車熟路)_你摯愛的強哥?給你發來1條消息?-CSDN博客?
在/api/demo/文件夾下面創建CURD.base.js
代碼內容
const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router;
module.exports = global.SG.router;
//經常需要修改的內容----------------------------------------------------------------
const demoJsonPath = "json/demo/test.json";//測試存儲數據的json文件路徑
const apiPath = "/demo/CURD.base";//定義前端請求的接口路徑
//----------------------------------------------------------------
const mkdirs = $g.dir.mkdirsByFilePath;//遞歸創建文件夾目錄(基于文件路徑)
/**【增】方法????????????????????????????????*/
const __C = (_curd) => {_curd._doText = "添加";let jsonPath = _curd.jsonPath, body = _curd.body, success = _response.success, fail = _response.fail;body = Object.assign({id: $g.date.timestamp()}, body);//自動添加時間戳為idfs.readFile(jsonPath, (err, data) => {if (err) return fail && fail({code: -1, msg: "讀取數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----添加失敗----");data = JSON.parse(data.toString());data.push(body);fs.writeFile(jsonPath, JSON.stringify(data), err => {if (err) return fail && fail({code: -1, msg: "寫入數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----添加失敗----");success && success({change: body, data}, _curd);//回顯發生改變的內容用于關聯表處理的前端業務,_curd._doText邏輯console.log($g.date.nowtime() + "\n", data, "\n----添加成功----");});});
};
/**【刪】方法????????????????????????????????*/
const __D = (_curd) => {_curd._doText = "刪除";const jsonPath = _curd.jsonPath, body = _curd.body, success = _response.success, fail = _response.fail;const ids = Array.isArray(body.id) ? body.id : [body.id.toString()]; //批量刪除功能fs.readFile(jsonPath, (err, data) => {if (err) return fail && fail({code: -1, msg: "讀取數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----刪除失敗----");data = JSON.parse(data.toString());let arr = data, re = [], successIds = [], changes = [];for (let i = 0, len = arr.length; i < len; i++) {let a = arr[i];ids.includes((a.id || "null").toString()) ? (successIds.push(a.id), changes.push(a)) : re.push(a);}if (!successIds.length) return fail && fail({code: -1, msg: `沒有找到對應id:${ids}的記錄,刪除失敗`, data}, _curd), console.error($g.date.nowtime(), "\n----刪除失敗----");fs.writeFile(jsonPath, JSON.stringify(re), err => {if (err) return fail && fail({code: -1, msg: "寫入數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----刪除失敗----");success && success({change: changes, data: re}, _curd);//回顯發生改變的內容用于關聯表處理的前端業務,_curd._doText邏輯console.log($g.date.nowtime() + "\n", re, `\n----id:${successIds}刪除成功----`);});});
};
/**【改】方法🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧🔧*/
const __U = (_curd) => {_curd._doText = "修改";const jsonPath = _curd.jsonPath, body = _curd.body, success = _response.success, fail = _response.fail, id = body.id;delete body.id;fs.readFile(jsonPath, (err, data) => {if (err) return fail && fail({code: -1, msg: "讀取數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----修改失敗----");data = JSON.parse(data.toString());let change = null, arr = data;for (let i = 0, len = arr.length; i < len; i++) {let a = arr[i];if (a.id === id) {for (let key in body) a[key] = body[key];change = a;break;}}if (!change) return fail && fail({code: -1, msg: `沒有找到對應${id}的記錄,修改失敗`, data}, _curd), console.error($g.date.nowtime(), "\n----修改失敗----");fs.writeFile(jsonPath, JSON.stringify(data), err => {if (err) return fail && fail({code: -1, msg: "寫入數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----修改失敗----");success && success({change, data}, _curd);//回顯發生改變的內容用于關聯表處理的前端業務,_curd._doText邏輯console.log($g.date.nowtime() + "\n", data, `\n----id:${id}修改成功----`);});});
};/**【查】方法🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍🔍*/
const __isMatch = (record, obj) => {let countDefault = 0, countMatch = 0;for (let key in obj) {countDefault++;record[key] == obj[key] && (countMatch++);}return countDefault === countMatch;
};
const __R = (_curd) => {_curd._doText = "查詢";const maxPageSize = 999999999;const jsonPath = _curd.jsonPath, body = _curd.body, success = _response.success, fail = _response.fail;let pageNum = parseInt(body.pageNum || 0);//默認從第1頁開始pageNum < 0 && (pageNum = 0);let pageSize = parseInt(body.pageSize || maxPageSize);//不傳參就顯示所有數據pageSize < 0 && (pageSize = maxPageSize);delete body.pageNum;delete body.pageSize;fs.readFile(jsonPath, (err, data) => {if (err) return fail && fail({code: -1, msg: "讀取數據失敗", data: err}, _curd), console.error($g.date.nowtime() + "\n", err, "\n----查詢失敗----");data = JSON.parse(data.toString());let re = [];CURD.js;let arr = data;for (let i = 0, len = arr.length; i < len; i++) {let a = arr[i];__isMatch(a, body) && re.push(a);}re = re.slice(pageNum * pageSize, pageSize ? (pageNum + 1) * pageSize : re.length);success && success({data: re, total: arr.length, pageNum: pageNum, pageSize: pageSize}, _curd);console.log($g.date.nowtime() + "\n", re, "\n----查詢成功----");});
};/**【響應體】方法◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
const _response = {success: (data, _curd) => $g.json.res(_curd.req, _curd.res, _curd._doText + "成功", data, true),fail: (err, _curd) => $g.json.res(_curd.req, _curd.res, err.msg, err.data, false)
};
/**【增刪改查】方法◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
const CURD = (_curd) => {//【增】????????????????????????????????if ($g.CURD.hasAndNoHasFields(_curd.body, [], ["id", "pageNum", "pageSize"])) return __C(_curd);//【刪】????????????????????????????????if ($g.CURD.hasAndNoHasFields(_curd.body, ["id"])) return __D(_curd);//【改】????????????????????????????????if ($g.CURD.hasAndNoHasFields(_curd.body, ["id"], ["pageNum", "pageSize"]) && $g.CURD.hasExceptFields(_curd.body, ["id", "pageNum", "pageSize"])) return __U(_curd);//【查】????????????????????????????????return __R(_curd);
};
/**增刪改查數據(all方法支持POST、GET、PUT、PATCH、DELETE傳參方式)◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
router.all(apiPath, (req, res) => {let body = JSON.parse(JSON.stringify(req.body));let jsonPath = body.jsonPath;//指定存儲數據的json文件路徑(路徑自動添加,如果沒有該文件,系統會自動創建此json,業務重心轉嫁到前端)jsonPath && delete body.jsonPath;jsonPath || (jsonPath = demoJsonPath);jsonPath.includes("/") || (jsonPath = "json/" + jsonPath);//判斷給定的路徑是否存在fs.exists(jsonPath, exists => {if (exists) {CURD({req, res, jsonPath, body});} else {mkdirs(jsonPath, () => fs.writeFile(jsonPath, "[]", err => {console.log(`${$g.date.nowtime()}創建${jsonPath}${err ? "失敗" : "成功"}`);CURD({req, res, jsonPath, body});}));}});
});
在index.js最后一行加入
app.use(API_PATH, require(`.${API_PATH}/demo/CURD.base`));//增刪改查數據(基礎版、免登陸、無鑒權)
運行
node index
注意:在接口當中如果使用全局變量,盡量是常量const,不要將頻繁修改的公共變量放在全局作用域,多個客戶端在同時訪問接口的時候會共用全局作用域中的變量,容易引起變量值沖突!!!
總結
以上是生活随笔為你收集整理的【敏捷开发】Node.js(nodejs)实现一个接口完成增删改查聚合接口4个功能,最大限度节省接口数量,正所谓“一口多用”(基础版、免登陆、无鉴权)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【亲测可用】用Electron和elec
- 下一篇: 【最简洁】一句CSS3代码实现不规则自定