Day29 NodeJS实作 III

新增功能完成後,接着是待办事项列表与删除待办事项。

前两天为了说明前後端应用程序和关联把文章写得有点杂乱,毕竟前端也是临时学的,没有办法以很清晰的概念说明,最後这两天还是回归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/itemListget()方法中介层以接受请求与回传资料。第一个中介层接收请求并从资料库取得资料,第二个中介层等候资料取得再回传至前端。

app.get("/api/itemList", (req, res, next) => {
    getItemList().then(next);
});

app.get("/api/itemList", (req, res) => {
    res.send(JSON.stringify({data: itemList}));
});

在前端应用程序接收回传的JSON格式资料後,可以将资料规划以列表呈现。

https://ithelp.ithome.com.tw/upload/images/20211015/20139980DoBqRFm6Mb.png

删除待办事项

删除待办事项会藉由前端提出请求时的待办事项ID进行条件删除。

首先建立两个Path为/api/deleteItempost()方法中介层,接收前端请求、从资料库中删除资料,并回传删除状态字串。

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 制作高精度原型 (下)

[Day14] 传值或传址(上)

JavsScript 的资料型别分成两大类,第一类是基本型别,第二类是物件型别,型别的介绍可以参考前...

[Day 2] 从单体式迁移至微服务架构,支援模组化开发的 Web 框架可以解决什麽问题?

近年微服务架构兴起,对於规模较小的开发团队而言,一开始就拆分为多个微服务是个沉重的负担,所以大多还是...

Day 29: Dynamic Programming, DP

这是什麽 Memoization + Divide and Conquer = Dynamic Pr...

701 CLIENT门禁系统卡片无效

甚麽设定都没改变的状况下 原先有人使用过的卡片改设定别人後变成无效卡片 拿新的卡片设定新进人员也是无...

[C]如何写一个 makefile

func1.h #ifndef _FUNC1_H_ #define _FUNC1_H_ void f...