节点会话没有正确保存

问题描述:

我看到了一些非常奇怪的节点会话。我使用express-sessionconnect-mongo保存会话。节点会话没有正确保存

我的会话设置如下(所有的请求都通过HTTPS):

var session = require('express-session'); 
var MongoStore = require('connect-mongo/es5')(session); 

var sess = {}; 

app.use(session({ 
    secret: 'xxxx', 
    saveUninitialized: false, 
    store: new MongoStore({ 
     mongooseConnection: mongoose.connection, 
     ttl: 60 * 30 // haf hour 
    }), 
    cookie: { secure: true } 
})); 

我有一个创建与节点的画布图像的路线:

app.get('/api/canvas', function(req, res) { 

    sess = req.session; 

    console.log('in canvas and sess is ', sess); 

    // create image stuff 
}); 

在亚洲其他应用程序,你可以设置像背景颜色的东西。然后,我清楚这些路线:

app.get('/api/clear', function(req, res) { 

    sess = req.session; 

    if (sess.colors) { 
     delete sess.colors; 
    } 

    sess.save(function(err) { 
     console.log('saved sess is now ', sess); 
     // session saved 
     helper.sendJsonResponse(req, res, 200, {}); 
    }) 
}); 

helper.sendJsonResponse()只是一个 HTTP代码和一个空的身体反应。

你可以看到我使用session.save()的回调函数,因为当我知道会话已被编辑和保存时,我只想回应请求。

但是,这并不总是奏效。如果我在会话中设置了颜色,然后清除它们(通过调用'api/clear'路径),然后调用路由来创建图像(通过调用'api/canvas'路径),'api/canvas上的会话'路线会议有时仍然有颜色设置。

只有我快速做到这一点,情况似乎就是这样。如果等待几秒钟,颜色将被清除以用于'api/canvas'路线。

注意:我不允许同时调用这些路由 - 我使用承诺并在用户界面中有一个微调器,覆盖整个屏幕直到请求完全完成。

当这种情况发生时,日志是这样的:

saved sess is now { cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    canvasHeight: 500, 
    canvasWidth: 591 
} 

当我做出请求“API /帆布”:

in canvas and sess is { cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    canvasHeight: 500, 
    canvasWidth: 591, 
    colors: 
    { 
     color1: 'red', 
     color2: 'green' 
    } 
} 

所以你可以看到,颜色属性仍设置。大约有50%的时间发生这种情况。剩下的时间,在第二个请求中,颜色属性已被删除。

什么可能会出错?我误解了会议的工作方式吗?

编辑

这得到不断越古怪。如果我将这些调用链接到用户界面中,那么称为'api/clear'路线,然后在Promise then()方法中调用'api/canvas'路线,它总是起作用。如果我打电话单独提出请求,结果是完全随机的 - 有时会话会更新,有时不会。

我检查了req.sessionID,它对于不同的请求总是相同的。

编辑 正确使用regenerate method作品,但并不理想,因为我失去了一切会议。

+1

你尝试过调试的“会话”代码本身的节省部分 - 与不'resave'参数组到'FALSE'? – raina77ow

+0

你是指express-session包内的保存方法吗? – Mark

+0

是的。从代码开始,您可以实际追踪整个事情。关键是要了解会议何时被提取和存储。 – raina77ow

删除操作符只删除一个引用,从来没有一个对象本身。如果它确实删除了对象本身,那么其他剩余的引用就会像C++删除那样悬而未决。 (并且访问它们中的一个会导致崩溃,为了使它们全部变为空将意味着在删除每个对象或为每个对象增加内存时需要额外的工作。)

由于Javascript是垃圾收集的,因此不需要删除对象他们自己 - 当无法再引用他们时,他们将被删除。

如果你与他们完成,因为这给了什么是能够回收垃圾收集更多信息,它可以删除对象引用有用的。如果引用保留给一个大对象,这可能会导致它不被回放 - 即使程序的其余部分实际上并未使用该对象。

参考:http://jennifermann.ghost.io/deleting-objects-in-javascript/

希望这有助于。

+0

IM删除对象的属性,而不是对象本身... – Mark

+0

你尝试分配颜色= null? –