0

問題は..画面に間違ったユーザーが表示されることがあります(誰かが別のユーザーのセッションを取得します)。しかし、それはほとんど起こりません。同時発生する場合にのみ発生すると思います。

このコードの何かがこの動作を引き起こす可能性がある場合は、提案してください。

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

どうもありがとう !

4

2 に答える 2

0

答えは... キャッシュ

中間の誰かがコンテンツをキャッシュし、間違ったコンテンツを間違った人に送信するため、セッションが混在しているように見えます

解決策は..サーバーがクライアントにキャッシュなしフラグを送信するようにすることです

res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
于 2013-07-15T16:18:54.293 に答える
0

(これが問題を引き起こしているかどうかはわかりませんが、とにかく言及する価値があるようです)

ここでreq.cookies.sessionは、オブジェクトであるを渡しています。

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

しかしcheckSession、あなたはそれがIDであると仮定しています:

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

好奇心から: Express 用の既存の MongoDB を利用したセッション ストアのいずれかを使用しない理由はあります?

また、Mongoose には、staticsを使用してクラス メソッドをモデルに追加する独自の方法があります。

于 2013-07-15T07:16:14.353 に答える