UNPKG

rrestjs

Version:

HIgh performance node.js ROA & RESTFUL web framework.

126 lines (119 loc) 4.58 kB
/* *SessionMongodb.js mongodb存储session对象的i/o操作 * *exports sessionMongodb 对象 * */ var mongo = require('./MongdbConnect'), RestUtils = require('./RestUtils'), outerror = require('./Outerror'), msg = require('./msg/msg'), sessionMongodb = module.exports = { dbname:_restConfig.MongodbDefaultDbName, //获取配置的数据库名字 collection: 'rrestsession', //配置collection名字 }; sessionMongodb.gen = function(expire, obj, callback){ //生成sessionid var obj = obj; obj._restexpire = expire; sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return dberror(err, release, callback);//如果出错 collection.insert(obj, {"safe":true}, function(err, doc){ //插入session数据 if(err) return dberror(err, release, callback); var doc = doc[0], _id = doc._id = doc._id.toString(), sessionid = RestUtils.md5(_id + sessionMongodb.dbname);//根据_id和数据库名md5生成sessionid doc._restsid=sessionid; collection.update({_id:sessionMongodb.genmongodbid(db, _id)}, {$set: {_restsid:sessionid}}, function(err){//将sessionid更新至文档 if(err) return dberror(err, release, callback); else{ release(); callback(err, sessionid, doc); } }); }); }); }; sessionMongodb.update = function(_restsid, obj){ //更新session if(!sessionMongodb.checksid(_restsid)) return; //如果sid不符合规范,跳出程序 var obj = obj; obj._resttimestamp = Date.now();//更新时间戳 delete obj._id; //删除_id,防止出错 sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return dberror(err, release); collection.update({_restsid:_restsid}, {$set: obj}, {"safe":true}, function(err, doc){ if(err) return dberror(err, release); else release(); }); }); }; sessionMongodb.get = function(_restsid, callback){ if(!sessionMongodb.checksid(_restsid)) return callback(msg.errmsg.sessionDbIdError);//如果sid不符合规范,则输出错误 sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return dberror(err, release, callback); collection.findOne({_restsid:_restsid}, function(err, doc){ if(err) return dberror(err, release, callback); else{ release(); callback(err, doc); //返回查询出的session文档给callback } }); }); }; sessionMongodb.del = function(_restsid){ //删除session if(!sessionMongodb.checksid(_restsid)) return;//检查sid是否合法 sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return dberror(err, release); collection.remove({_restsid:_restsid}, {"safe":true}, function(err, count){ if(err) return dberror(err, release); else release(); }); }); }; sessionMongodb.clear = function(clearTime){ //循环执行的,根据expire,删除指定session var now = Date.now(), expire = now - clearTime; sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return dberror(err, release); collection.remove({"_resttimestamp":{$lte:expire}}, {"safe":true}, function(err, count){ if(err) return dberror(err, release); else release(); }); }); }; sessionMongodb.checksid = function(sid){//判断sessionid是否合法 if(!/^[A-Za-z0-9]{32,32}$/.test(sid)) return false; return true; } sessionMongodb.genmongodbid = function(db, id){ try{ return db.bson_serializer.ObjectID.createFromHexString(id); } catch(e){ return false; } } sessionMongodb.connectCollection = function(callback){ //获取保存 session 的collection try{ mongo(function(err, db, release){//Caution release! if(err) return callback(err); db.collection(sessionMongodb.collection, function(err, collection){ callback(err, db, collection, release) }); }, sessionMongodb.dbname); } catch(err){} }; sessionMongodb.ensureIndex = function(){ //将sid作为索引,加速monogdb操作 if(!_restConfig.sessionDbStore) return; sessionMongodb.connectCollection(function(err, db, collection, release){ if(err) return outerror(msg.parse(msg.errmsg.sessionDbProcessError, err)); collection.ensureIndex({"_restsid":1}, function(err, r){ release(); }) }) }() var dberror = function(err, release, callback){ //归还通用连接,出错调用,记录数据库错误日志 release(); outerror(msg.parse(msg.errmsg.sessionDbCommonError, err)); callback && callback(err); }