function createSession(){
// read encrypted session-id from the request
if( sessionId ){
// decrypt it
if (decryptedSessionId ) {
//read session detail from the store
options.store.get(decryptedSessionId, (err, sessionFromStore) => {
if(err){
throw Error(err);
}else if( sessionFromStore){
if( shouldRenew(sessionFromStore) ){
//delete previous session
options.store.destroy(sessionFromStore.id, err=> {
//update the session object in memory
});
}
}else{ //session detail is not present in store
// create new session
}
});
} else { //invalid or tempered session
// throw error
}
}else{ //session-id is not presnet in request
// create new session
}
}
正如您所注意到的,当会话有效并且通过删除上一个会话来满足某些条件时,我正在续订会话。但我不会马上在店里更新。相反,我更新存储中的会话信息,并在将响应发送到客户端时设置cookies。
情节
-
存储区中未更新会话。因此,我将用另一个新会话id续订上一个会话。在这种情况下,用户将拥有多个会话id。
-
存储中的会话已更新。现在,上一个会话将在应用商店中不可用。如果是授权会话,我将不得不要求用户再次登录。或者我会创建另一个会话。
如何处理这种竞争状况?
Here
是完整的代码,以备不时之需。