Express.js Node.js中的Mongoose Query Data,得到错误的结果

时间:2013-07-15 06:57:26

标签: node.js mongodb session express

问题是..有时候它会在屏幕上显示错误的用户(某人获得另一个用户的会话)。但它几乎不会发生,我认为它只会在有并发的时候发生。

如果此代码中的任何内容可以使此行为发生,请建议。

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');

routes / 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});
    });
}

非常感谢!

2 个答案:

答案 0 :(得分:0)

(不确定这是否会导致问题,但无论如何都值得一提)

在这里,你传递req.cookies.session,这是一个对象:

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

但是在checkSession中,你假设它是一个id:

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

出于好奇:为什么你没有使用现有的MongoDB支持的会话商店之一(如this one)?

此外,使用statics,Mongoose有自己的方法将类方法添加到模型中。

答案 1 :(得分:0)

答案是......缓存

中间的某个人会缓存内容,并且还会向错误的人发送错误的内容,因此会话似乎是混合的

出路是..使服务器发送标志没有缓存到客户端

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