新增功能完成後,接着是待办事项列表与删除待办事项。
前两天为了说明前後端应用程序和关联把文章写得有点杂乱,毕竟前端也是临时学的,没有办法以很清晰的概念说明,最後这两天还是回归NodeJS的部份,把服务器端的API和资料库连接的部份好好说明。
在前一天开发新增功能的时候,已经针对todoProj
资料库建立Schema以及Model,在读取及删除资料时,都会以此Model进行。
let Schema = mongoose.Schema;
let itemSchema = new Schema({
Title: String,
Note: String,
Date: String,
Tag: String
});
let itemData = mongoose.model("Item", itemSchema);
读取待办事项时,也要先建立资料库的连接。首先新建一个函式以藉此读取资料,在其中以mogoose建立与资料库的连线,并以find()
方法选取资料,exec()
是执行取得资料的动作,其中可以设定回呼函式以进行後续资料处理,这里将资料指派给全域变数itemList。
let ietmList=[];
function getItemList(){
return new Promise((resolve, reject) =>{
mongoose.connect("mongodb://localhost:27017/todoProj")
.then(()=>{
itemData.find().exec(function(err, items){
itemList = items;
resolve();
});
}).catch(err => {
console.log(err);
reject(err);
});
});
}
接着是後端与前端的资料传递,建立两个Path为/api/itemList
的get()
方法中介层以接受请求与回传资料。第一个中介层接收请求并从资料库取得资料,第二个中介层等候资料取得再回传至前端。
app.get("/api/itemList", (req, res, next) => {
getItemList().then(next);
});
app.get("/api/itemList", (req, res) => {
res.send(JSON.stringify({data: itemList}));
});
在前端应用程序接收回传的JSON格式资料後,可以将资料规划以列表呈现。
删除待办事项会藉由前端提出请求时的待办事项ID进行条件删除。
首先建立两个Path为/api/deleteItem
的post()
方法中介层,接收前端请求、从资料库中删除资料,并回传删除状态字串。
let deleteRes="";
app.post("/api/deleteItem", (req, res, next) =>{
deleteItem(req.body.id).then(next); // deleteItem为删除资料的自定义函式
});
app.post("/api/deleteItem", (req, res) =>{
res.end(JSON.stringify({data: deleteRes})); // deleteRes会在deleteItem()中指派值
});
接着把deleteItem()
函式定义完成,先以mongoose建立连线後,使用deleteOne({[筛选条件]})
方法设定删除目标资料,exec()
执行动作并指派字串至全域变数deleteRes
,作为回传的资料。
function deleteItem(objId){
return new Promise((resolve, reject) =>{
mongoose.connect("mongodb://localhost:27017/todoProj")
.then(()=>{
itemData.deleteOne({_id: objId}).exec(function(err){
if (err!=null) return reject(err);
deleteRes = "success";
resolve();
});
}).catch(err => {
console.log(err);
reject(err);
});
});
}
今天的资料取得与删除的部分顺利地完成了,其实纯粹以後端服务器的开发,NodeJS和mongoDB的组合真的可以让速度提升很多,而且语法也很单纯,比较需要注意的是要记得资料库处理需要时间,使用非同步的工具以等候资料库作业运行完成。
<<: 第 29 集:Bootstrap 客制化 component 元件样式
>>: Day 29. Hi-Fi Prototype-以 Figma 制作高精度原型 (下)
JavsScript 的资料型别分成两大类,第一类是基本型别,第二类是物件型别,型别的介绍可以参考前...
近年微服务架构兴起,对於规模较小的开发团队而言,一开始就拆分为多个微服务是个沉重的负担,所以大多还是...
这是什麽 Memoization + Divide and Conquer = Dynamic Pr...
甚麽设定都没改变的状况下 原先有人使用过的卡片改设定别人後变成无效卡片 拿新的卡片设定新进人员也是无...
func1.h #ifndef _FUNC1_H_ #define _FUNC1_H_ void f...