Fork me on GitHub

node之mongodb的DAO

DAO就是数据库的提供方法再封装一层。

mongodb-DAO:

var mongoClient=require("mongodb").MongoClient;
//数据库连接
var setting=require("../settings.js");

//连接数据库方法
function _connectDB(callback){
    var url=setting.dburl;
    mongoClient.connect(url,function(err,db){
        if(err){
            callback(err,null);
            return ;
        }
        callback(err,db);
    });
}

//插入数据
exports.insertOne=function(collectionName,json,callback){
    _connectDB(function(err,db){
        db.collection(collectionName).insertOne(json,function(err,result){
            callback(err,result);
            db.close();
        });
    });
}

//查找数据
exports.find=function(collectionName,json,C,D){
    var result=[];
    var argsLen=arguments.length;
    var limit=0;
    var skipNum=0;
    var callback=C;
    var sort={};
    if(argsLen==4){
        var args=C;
        callback=D;
        limit=args.pageamount||0;
        skipNum=args.pageamount*args.page||0;
        sort=args.sort||{};
    }
    _connectDB(function(err,db){
        if(err){
            res.send(err);
            return ;
        }
        var cursor=db.collection(collectionName).find(json).limit(limit).skip(skipNum).sort(sort);
        cursor.each(function(err,doc){
            if(err){
                callback(err,null);
                db.close();
                return ;
            }
            if(doc!=null){
                result.push(doc);
            }else{
                callback(err,result);
                db.close();
            }
        });
    });
}

//删除
exports.deleteMany=function(collectionName,json,callback){
    _connectDB(function(err,db){
        db.collection(collectionName).deleteMany(json,function(err,result){
            callback(err,result);
            db.close();
        })
    });
}
//更新
exports.updataMany=function(collectionName,json1,json2,callback){
    _connectDB(function(err,db){
        db.collection(collectionName).updataMany(json1,json2,function(err,result){
            callback(err,result);
            db.close();
        })
    });
}

//获取集合数据总量
exports.getAllCount=function(collectionName,callback){
    _connectDB(function(err,db){
        db.collection(collectionName).count().then(function(count){
            callback(count);
            db.close();
        });
    });
}
settings.js:
module.exports={
    "dburl":"mongodb://localhost:27017/tab"
}

下面是一个登录-注册-留言的例子:

var express=require("express");
var app=express();
var db=require("./model/mdb.js");

/*formidable必须类表单提交,直接ajax不行,如使用ajax提交表单*/
var formidable=require("formidable");

/***
    mongodb可以直接创建库,只要库不存它就会创建,当存在时就使用当前的
    集合也是,所以它很灵活,是一门可以使用js编写shell的数据库
    它不看重字段的一致性,所以它可以随便储存
    每个集合下的文档里的json对象里的对象里都有一个_id的,可以使用它做唯一标示符
    因为它是一个对象,所以需要一些特殊方式转换它,如nodeJS里的require("mongodb").ObjectID
    引入一个模块对象直接转换它
*/
var ObjectID=require("mongodb").ObjectID;

var session = require("express-session");

var md5 = require('./model/md5.js');

//session默认设置  只有req有session设置和获取
app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true
}));

//引用渲染页面引擎
app.set("view engine","ejs");
//静态文件位置
app.use(express.static("./public"));

//入口
app.get("/",function(req,res,next){
    if(!req.session.login){
        res.redirect("/zhuce");
        return ;
    }
    //查询数据的总量
    db.getAllCount("liuyanban",function(count){
        res.render("index",{
            pageamount:Math.ceil(count/5),
            name:req.session.username
        });
    });
});

//提交
app.post("/tijiao",function(req,res,next){
    var form=new formidable.IncomingForm();

    form.parse(req,function(err,fields){
        db.insertOne("liuyanban",{
            "name":fields.name,
            "des":fields.des,
            "time":new Date()
            },function(err,result){
                if(err){
                    res.send(false);
                    return ;
                }
                    res.send(true);
        });
    });

});

//查询
app.get("/read",function(req,res,next){
    var pageNum=parseInt(req.query.pageNum);
        db.find("liuyanban",{},{
            pageamount:5,
            page:pageNum,
            sort:{time:-1}
        },function(err,result){
            var obj={status:false};
            if(err){
                res.send(obj);
                return ;
            }
            obj["status"]=true;
            obj["content"]=result;
            res.send(obj);
        });
});

//删除
app.get("/shanchu",function(req,res,next){
    var id=ObjectID(req.query.id);
        db.deleteMany("liuyanban",{_id:id},function(err,result){
            if(err){
                res.send("删除失败");
                return ;
            }
                res.redirect("/");
        });
});

//注册
app.post("/zhuce",function(req,res,next){
    var form=new formidable.IncomingForm();
    form.parse(req,function(err,fields){
        db.insertOne("user",{
            "name":fields.name,
            "pwd":md5(fields.pwd)
            },function(err,result){
                if(err){
                    res.send(false);
                    return ;
                }
                    res.send(true);
        });
    });

});
//注册
app.get("/zhuce",function(req,res,next){
    res.render("zhuce");
});

//登录
app.post("/denglu",function(req,res,next){
    var form=new formidable.IncomingForm();
    form.parse(req,function(err,fields){
        var pwd=md5(fields.pwd);
        db.find("user",{
            name:fields.name
        },function(err,result){
            var obj={};
            if(err){
                res.send(obj);
                return ;
            }
            if(result.length==0){
                obj={status:false,err:"账号错误"};
                res.send(obj);
                return ;
            }
            if(pwd!=result[0].pwd){
                obj={status:false,err:"密码错误"};
                res.send(obj);
                return ;
            }
            req.session.login = true;
            req.session.username = result[0].name;
            obj["status"]=true;
            obj["content"]=result;
            res.send(obj);
        });
    });

});
//登录
app.get("/denglu",function(req,res,next){
    res.render("denglu");
});
app.listen(3000);

没有给目录结构。因为结构是默认设置那种。

 MD5:

var crypto = require('crypto');

function md5(str){
    var md5Method=crypto.createHash("md5");
    var pwd=md5Method.update(str.toString()).digest("base64");
    return pwd;
}

function dealMd5(str){
    return md5(md5(str).substr(2,5)+md5(str)+md5(str).substr(4,7));
}

module.exports=dealMd5;

 

每次使用mongodb都要开启数据库。

普通开启

mongod --dbpath c:\mongo

选择引擎开启,因为mongodb3后出现两个引擎,而新引擎有些mongodb客户端不兼容
mongod --storageEngine mmapv1 --dbpath c:\mongo

 

posted @ 2017-09-14 23:20  小数点就是问题  阅读(406)  评论(0编辑  收藏  举报