2013-07-15 3 views
0

Проблема в том, что иногда появляется неправильный пользователь на экране (кто-то получает сеанс другого). но это вряд ли произойдет, и я думаю, что это происходит только тогда, когда есть некоторые параллели.Данные запроса Mongoose в Express.js Node.js, получите неправильный результат

Если что-либо в этом коде может привести к поведению, пожалуйста, предложите.

app.js - этот файл имеет схему и инициацию модели и маршрутов компонента

var userSchema = mongoose.Schema({ 
    "_id": mongoose.Schema.Types.ObjectId, 
    "name": String, 
    "username":String, 
    "etc":String 
}); 
userMongooseModel = mongoose.model('users',userSchema); 

var sessionSchema = mongoose.Schema({ 
    "userID": mongoose.Schema.Types.ObjectId, 
    "sessionID": String, 
    "expire":Number 
}); 
sessionMongooseModel = mongoose.model('sessions',sessionSchema); 

var UserModel = require(basePath+'/models/UserModel.js').UserModel; 
userModel = new UserModel(); 

var user = require(basePath+'/routes/user'); 

маршруты/user.js - этот файл подробно о каждом маршруте.

exports.editProfilePage = function(req,res){ 
    var httpRes = res; 
    userModel.checkSession(req.cookies.session,function(res){ 
     if(res.status=='success' && res.type=='photographer') 
     { 
      userModel.getByID(res.userID,{},function(resp){ 

       httpRes.render(basePath+'/views/photographer-edit.html',{currentUser:res.user,user:resp.user,etc:'etc'}); 
      }); 
     } 
     else 
     { 
      //if not login or state != 0 
      httpRes.redirect(baseURL+'/photographerRedirect'); 
     } 
    }); 
} 

usermodel.js - это файл для извлечения данных из базы данных

var mongoose = require('mongoose'); 
var ObjectId = mongoose.Types.ObjectId; 
var request = require('request'); 

UserModel.prototype.checkSession = function(sessionID,callback){ 
    sessionMongooseModel.findOne({sessionID:sessionID},function (err, user) {  
     if(err) 
     { 
      callback({status:'fail',errorMsg:'notFound'}); 
      return; 
     } 
     if(user==null) 
     { 
      callback({status:'fail',errorMsg:'notFound'}); 
     } 
     else 
     { 
      if(user.expire > Date.now()) 
      { 
       userMongooseModel.findOne({_id:user.userID},{studioName:1,state:1,etc:1},function (err, user) { 
        if(err || user==null) 
        { 
         callback({status:'fail',errorMsg:'notFound'}); 
         return; 
        } 
        if(user.type=='photographer' && user.state==0) 
        { 
         callback({status:'fail',errorMsg:'wrongUserState',userID:user._id,user:user,etc:1}); 
        } 
        else 
         callback({status:'success',userID:user._id,user:user,type:user.type,etc:1}); 
       });    
      } 
      else 
      { 
       callback({status:'fail',errorMsg:'notFound'}); 
      } 
     } 
    }); 
} 


UserModel.prototype.getByIDs = function(userIDs,options,callback){ 
    userMongooseModel.find({_id:{$in:userIDs}},options,function (err, users) { 
     if(err){ 
      callback({status:'fail',errorMsg:'UserModel.find'}); 
      return; 
     } 
     callback({status:'success',users:users}); 
    }); 
} 

Спасибо большое!

ответ

0

Ответ ... кэш

Кто-то в середине кэш содержание, а также отправить неверное содержание к тому человеку, так что кажется, что сессия смешали

выход есть. . сделать флаг отправки сервера без кеша клиенту

res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'); 
0

(не уверен, если это вызывает проблемы, но мне кажется, стоит отметить, во всяком случае)

Здесь вы передаете req.cookies.session, который является объектом:

userModel.checkSession(req.cookies.session, ...); 

Но в checkSession, вы «повторно при условии, что это идентификатор:

UserModel.prototype.checkSession = function(sessionID, callback) { 
    sessionMongooseModel.findOne({sessionID:sessionID}, ...); 

Просто из любопытства: какая-либо причина, почему вы не используете один из существующих MongoDB спинок сессии магазинов для Ex нажмите (например, this one)?

Кроме того, у Mongoose есть собственный способ добавления методов класса к моделям, используя statics.

Смежные вопросы