Tối ưu hóa đoạn code thêm xóa sửa file json



  • Chẳng phải là ngồi không mà sinh chuyện, mà bởi vì chúng ta là các dev mà cũng chẳng có nhiều tiền, phải khai thác mấy cái free miễn phí như heroku nên phải làm một cái gì đó để lưu trữ tạm thời trên server của người khác nên mình ngồi code thử cái crud json file này, ace góp ý cho nó chạy mượt mà (xem như học hỏi lẫn nhau) để rồi có khi hữu sự

    Giả sử file dat.json chúng ta có cấu trúc thế này

    
    {
        "size": 5,
        "list": [
            {
                "id": 2,
                "name": "one",
                "pass": "one",
                "level": 1
            },
            {
                "id": 3,
                "name": "two",
                "pass": "two"
            },
            {
                "id": 4,
                "name": "xxx",
                "pass": "yyy"
            },
            {
                "id": 5,
                "name": "vo tong",
                "pass": "111"
            }
        ]
    }
    
    

    vị trí thư mục thế này

    
    +controller
      |   
       -test.js
     +json_crud
       |
        -dat.json
    
    

    Mình viết một cái func thế này

    
    var Dat=function(file){
        var that={
            lds:function(){
                const path = require('path');
                let realPath = path.join(__dirname, file);
                var fs=require('fs');
                return new Promise(function(res,rej){
                    fs.readFile(realPath , 'utf8', function (err, data) {
                        if(!err){
                            var ar=JSON.parse(data);
                            res(ar.list);
                        }else{
                            rej(err);
                        }
                    })
                })
            },
            add:function(name,pass){
                const path = require('path');
                let realPath = path.join(__dirname, file);
                var ar=require(file);
                var size=ar.size;
                var list=ar.list;
                var item={id:size+1,name:name,pass:pass}
                list.push(item);
                size++;
                var fs=require('fs');
                var ar2={
                    size:size,
                    list:list
                }
                return new Promise(function(res,rej){
                    fs.writeFile(realPath,JSON.stringify(ar2),function(err){
                        if(!err){
                            res(item);
                        }else{
                            //console.log('save')
                            rej(err);
                        }
                    });
                });
            },
            del:function(id){
                var ar=require(file);
                var size=ar.size;
                var list=ar.list;
                var tim_thay=0;
                var i=0;
                while( tim_thay==0 && i<list.length ){
                    if(list[i].id==id){
                        tim_thay=1;
                    }else{
                        i++;
                    }
                }
                if(tim_thay==1){
                    list.splice(i,1);
                }
                var ar2={
                    size:size,
                    list:list
                }
                return new Promise(function(res,rej){
                    var fs = require('fs');
                    const path = require('path');
                    let realPath = path.join(__dirname, file);
                    fs.writeFile(realPath, JSON.stringify(ar2), function (err) {
                        if (!err) {
                            res(tim_thay);
                        } else {
                            rej(err);
                        }
                    });
                });
            },
            edit:function(r){
                //r={id,name,pass}
                var ar=require(file);
                var size=ar.size;
                var list=ar.list;
                var tim_thay=0;
                var i=0;
                while( tim_thay==0 && i<list.length ){
                    if(list[i].id==r.id){
                        tim_thay=1;
                    }else{
                        i++;
                    }
                }
                if(tim_thay==1){
                    //list.splice(i,1);
                    list[i]=r;
                }
                var ar2={
                    size:size,
                    list:list
                }
                return new Promise(function(res,rej){
                    var fs = require('fs');
                    const path = require('path');
                    let realPath = path.join(__dirname, file);
                    fs.writeFile(realPath, JSON.stringify(ar2), function (err) {
                        if (!err) {
                            res(tim_thay);
                        } else {
                            rej(err);
                        }
                    });
                });
            }
        }
        return that;
    }    
    
    
    
    

    Sử dụng thế này

    
    
    var dat=Dat('../json_crud/dat.json')
    router.get('/', function (req, res) {
        dat.lds()
        //dat.del(1)
        //dat.edit({id:5,name:'vo tong',pass:'111'})
        .then(function(kq){
            console.log(kq);
        })
        .catch(function(err){
            console.log(err);
        })
        var data= {}
        res.render('json_crud/index', data );
    })
    
    
    
    

    Ace bình luận xem có ổn không

    
    code cùi bắp thì ace chớ cười nhé...nào bắt đầu.
    
    

    Hiện giờ test thử thì cũng hơi ok



  • @Thuc-Nguyen-tan
    Theo mình mấy câu lệnh require nên để ở đầu file
    const path = require('path');
    var fs=require('fs');

    Những hàm API của node có thể wrap lại và chuyển qua đạng promise. Bạn có thể tìm hiểu Promisify của bluebird library

    return new Promise(function(res,rej){
      fs.readFile(realPath , 'utf8', function (err, data) {...}
    ...
    });
    

    có thể viết lại như sau:

    const readFile = Promise.promisify(fs.readFile, { context: fs });
    return readFile(realPath, 'utf8')
    	.then((data) => {
    		const ar = JSON.parse(data);
    		return ar.list;
    	});
    

    papa elf

    1


  • okay bạn, một số lỗi về bất đồng bộ.

    
    var Dat=function(file){
        var that={
            get_path_file:function(){
                const path = require('path');
                let realPath = path.join(__dirname, file);
                return realPath;
            },
            get_json:function(){
                var realPath=this.get_path_file();
                return new Promise(function(res,rej){
                    var fs=require('fs');
                        fs.readFile(realPath , 'utf8', function (err, data) {
                        if(!err){
                            var ar=JSON.parse(data);
                            res(ar);
                        }else{
                            rej(err);
                        }
                    })
                })
            },
            lds:function(){
                var realPath=this.get_path_file();
                return new Promise(function(res,rej){
                    var fs=require('fs');
                        fs.readFile(realPath , 'utf8', function (err, data) {
                        if(!err){
                            var ar=JSON.parse(data);
                            res(ar.list);
                        }else{
                            rej(err);
                        }
                    })
                })
            },
            add:function(name,pass){
                var path_file=this.get_path_file();
                var fs=require('fs');
                return this.get_json()
                .then(function(ds){
                    var ar=ds;
                    var size=ar.size;
                    var list=ar.list;
                    var item={id:size+1,name:name,pass:pass}
                    list.push(item);
                    size++;
                    var ar2={
                        size:size,
                        list:list
                    }
                    return new Promise(function(res,rej){
                        fs.writeFile(path_file,JSON.stringify(ar2),function(err){
                            if(!err){
                                res(item);
                            }else{
                                rej(err);
                            }
                        });
                    }); 
                })
            },
            del:function(id){
                var fs = require('fs');
                //const path = require('path');
                //let realPath = path.join(__dirname, file);
                var realPath=this.get_path_file();
                return this.get_json().then(function(ds){
                    var ar=ds;//require(file);
                    var size=ar.size;
                    var list=ar.list;
                    var tim_thay=0;
                    var i=0;
                    while( tim_thay==0 && i<list.length ){
                        if(list[i].id==id){
                            tim_thay=1;
                        }else{
                            i++;
                        }
                    }
                    if(tim_thay==1){
                        list.splice(i,1);
                    }
                    var ar2={
                        size:size,
                        list:list
                    }
                    return new Promise(function (res, rej) {
                        fs.writeFile(realPath, JSON.stringify(ar2), function (err) {
                            if (!err) {
                                res(tim_thay);
                            } else {
                                rej(err);
                            }
                        });
                    });
                })
            },
            edit:function(r){
                var ar=require(file);
                var size=ar.size;
                var list=ar.list;
                var tim_thay=0;
                var i=0;
                while( tim_thay==0 && i<list.length ){
                    if(list[i].id==r.id){
                        tim_thay=1;
                    }else{
                        i++;
                    }
                }
                if(tim_thay==1){
                    list[i]=r;
                }
                var ar2={
                    size:size,
                    list:list
                }
                return new Promise(function(res,rej){
                    var fs = require('fs');
                    const path = require('path');
                    let realPath = path.join(__dirname, file);
                    fs.writeFile(realPath, JSON.stringify(ar2), function (err) {
                        if (!err) {
                            res(tim_thay);
                        } else {
                            rej(err);
                        }
                    });
                });
            }
        }
        return that;
    }    
    
    //var dat=Dat('../json_crud/dat.json')
    var dat=Dat('../json_crud/dat.json')
    
    
    
    
    
    

    ps: hàm edit chưa sửa--> nên đổi tên thành update

    • còn hàm find chưa thiết lập


  • Đây là phiên bản mình cho là gần cuối cùng, còn thiếu hàm find

    
    
    var Dat=function(file){
        var that={
            get_path_file:function(){
                const path = require('path');
                let realPath = path.join(__dirname, file);
                return realPath;
            },
            get_json:function(){
                var realPath=this.get_path_file();
                return new Promise(function(res,rej){
                    var fs=require('fs');
                        fs.readFile(realPath , 'utf8', function (err, data) {
                        if(!err){
                            var ar=JSON.parse(data);
                            res(ar);
                        }else{
                            rej(err);
                        }
                    })
                })
            },
            lds:function(){
                return this.get_json()
                .then(function(ds){
                    return ds.list;
                })
            },
            add:function(name,pass){
                var path_file=this.get_path_file();
                var fs=require('fs');
                return this.get_json()
                .then(function(ds){
                    console.log(ds)
                    var ar=ds;
                    var size=ar.size;
                    var item={id:size+1,name:name,pass:pass}
                    ar.list.push(item);
                    ar.size++;
                    return new Promise(function(res,rej){
                        fs.writeFile(path_file,JSON.stringify(ar),function(err){
                            if(!err){
                                res(item);
                            }else{
                                rej(err);
                            }
                        });
                    }); 
                })
            },
            del:function(id){
                var fs = require('fs');
                var realPath=this.get_path_file();
                return this.get_json().then(function(ds){
                    var ar=ds;//require(file);
                    var size=ar.size;
                    var list=ar.list;
                    var tim_thay=0;
                    var i=0;
                    while( tim_thay==0 && i<list.length ){
                        if(list[i].id==id){
                            tim_thay=1;
                        }else{
                            i++;
                        }
                    }
                    if(tim_thay==1){
                        list.splice(i,1);
                    }
                    var ar2={
                        size:size,
                        list:list
                    }
                    return new Promise(function (res, rej) {
                        fs.writeFile(realPath, JSON.stringify(ar2), function (err) {
                            if (!err) {
                                res(tim_thay);
                            } else {
                                rej(err);
                            }
                        });
                    });
                })
            },
            update:function(r){
                var fs = require('fs');
                var realPath=this.get_path_file();
                return this.get_json()
                .then(function(ar){
                    var size=ar.size;
                    var list=ar.list;
                    var tim_thay=0;
                    var i=0;
                    while( tim_thay==0 && i<list.length ){
                        if(list[i].id==r.id){
                            tim_thay=1;
                        }else{
                            i++;
                        }
                    }
                    if(tim_thay==1){
                        list[i]=r;
                    }
                    return new Promise(function (res, rej) {
                        fs.writeFile(realPath, JSON.stringify({size:size,list:list}), function (err) {
                            if (!err) {
                                res(tim_thay);
                            } else {
                                rej(err);
                            }
                        });
                    }) 
                })
            }
        }
        return that;
    }    
    var dat=Dat('../json_crud/dat.json')
    
    
    
    

    any idea???



  • Đây là đoạn code mình đọc file cũng như sửa và xóa, trong ứng dụng chat
    0_1511429771544_check.png image url)


Log in to reply