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