2016-12-29 94 views
6

我看到了一些非常奇怪的節點會話。我使用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

回答

0

刪除操作符只刪除一個引用,從來沒有一個對象本身。如果它確實刪除了對象本身,那麼其他剩餘的引用就會像C++刪除那樣懸而未決。 (並且訪問它們中的一個會導致崩潰,爲了使它們全部變爲空將意味着在刪除每個對象或爲每個對象增加內存時需要額外的工作。)

由於Javascript是垃圾收集的,因此不需要刪除對象他們自己 - 當無法再引用他們時,他們將被刪除。

如果你與他們完成,因爲這給了什麼是能夠回收垃圾收集更多信息,它可以刪除對象引用有用的。如果引用保留給一個大對象,這可能會導致它不被回放 - 即使程序的其餘部分實際上並未使用該對象。

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

希望這有助於。

+0

IM刪除對象的屬性,而不是對象本身... – Mark

+0

你嘗試分配顏色= null? –