標籤:ring engine 結構 密碼 enum name pre amount cal
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
node之mongodb的DAO