2014-10-28 37 views
0

我在使用express/session和node/html項目時遇到問題。Nodejs:會話在生成後未定義

  1. login.html對節點程序進行ajax調用。

  2. 如果成功,節點將生成一個會話,記住屬性req.session.username中的用戶名並將文件名csmain.html返回到login.html。然後login.html將瀏覽器重定向到csmain.html

  3. csmain.html然後立即在其load()作出ajax呼叫,但問題是在這個時候會議似乎沒有準備好。 req.session.user在節點中未定義。這意味着該會話尚未被瀏覽器在load()的ajax調用中使用。

任何想法如何解決這個問題?在節點的登錄部分

代碼來生成會話

request.session.regenerate(function(err) { 
}); 
if (request.session.views) { 
    // empty 
} else { 
    request.session.views = 1; 
    request.session.username = username; 
} 

HTML重定向在登錄HTML --javascript一部分。在xmlHttp.responseText的第一個字符是登錄狀態,剩餘的文本是由於您使用一個數據庫作爲一個會話存儲,那麼它很可能是regenerate()調用是異步的HTTP鏈接

if (status === BDX_ERR_SQL_WRONG_PASSWORD) { 
    document.getElementById("feedbackMsg").innerHTML = 'login error'; 
}else if (status === '0') { 
    window.location = '../' + xmlHttp.responseText.substring(1, len); 
} 
+0

什麼樣的會話存儲您使用的是?在某些情況下,'regenereate()'可能是異步的,這意味着它不會在調用回調之前完成,因此您必須將使用新會話的代碼放入再生回調中。 – jfriend00 2014-10-28 22:07:25

+0

@ jfiend00我使用redis作爲會話的backstore。再生的回調是什麼?我在快速會議網站找不到。你能舉個例子嗎? – StevenZ 2014-10-28 22:20:25

回答

1

。這意味着,regenerate()不這樣做,直到調用回調,所以你需要做的是這樣:

request.session.regenerate(function(err) { 
    // should do error checking here 

    if (request.session.views) { 
     // empty 
    } else { 
     request.session.views = 1; 
     request.session.username = username; 
    } 

    // continue with the rest of your code flow here inside the callback 

}); 

Express會話文檔在這裏:https://github.com/expressjs/session#sessionregenerate

+0

非常感謝,現在它將所有剩餘的代碼放入包括response.writ('csmain.html')在內的regenerate(){...}中,現在可以工作了......我在嘗試將會話屬性分配行進入它,並沒有奏效。 – StevenZ 2014-10-29 01:09:23