2017-06-21 58 views
0

我正在使用nodejs,express,mongoose和護照npm製作webapp。nodejs護照沒有註銷,因爲中間件

之前我的登錄和註銷功能工作正常,但現在我不得不添加一項功能來檢查用戶是高級用戶還是普通用戶。 所以我做了一箇中間件,它現在導致註銷問題。 這是我的代碼。

在我的index.js文件中,每秒調用一次/ matchData上的ajax請求以根據用戶類型獲取數據。

//ajax routes for json response 
router.get('/matchData', isPremium); 


//middleware causing problem 
function isPremium(req,res,next){ 
    if(req.isAuthenticated()){ 
     if(req.user.type=='premium'){ 
      console.log("user is premium"); 
      Match.getMatchLatestData(function(err,match){ 
       if(err) throw err; 
       res.send(match[0]); 
      }); 
     }else{ 
      console.log("user is loggedin but not premium"); 
      Match.getMatchData(function(err,match){ 
       if(err) throw err; 
       res.send(match[0]); 
      }); 
     } 
    }else{ 
     console.log("user not logged in"); 
     Match.getMatchData(function(err,match){ 
      if(err) throw err; 
      res.send(match[0]); 
     }); 
    } 
} 

,在我的user.js的在我的登錄和註銷functionalty是如下

//Login Routes 
router.get('/login',isAuthenticated2, function(req, res, next) { 
    res.render('user/login',{ 
    title:'login' 
    }); 
}); 

router.post('/login',isAuthenticated2, passport.authenticate('local',{failureRedirect:'/users/login', failureFlash:'Invalid Email Id or Password'}),function(req,res){ 
    console.log('Authentication Successful'); 
    req.flash('success','You are logged in.'); 
    res.redirect('/'); 
}); 

//logout route 
router.get('/logout',isAuthenticated,function(req,res){ 
    req.logout(); 
    req.flash('success','You have logged out'); 
    res.redirect('/'); 
}); 

function isAuthenticated(req, res, next) { 
    if(req.isAuthenticated()) 
     return next(); 
    else{ 
     req.flash('error','Please Login First') 
     res.redirect('/users/login'); 
    } 

} 

function isAuthenticated2(req, res, next) { 
    if(req.isAuthenticated()){ 
     req.flash('info','You are already logged in.') 
     res.redirect('/'); 
    } 
    else 
     return next(); 
} 

現在的問題是,當我註銷它顯示閃存味精成功,但在我的控制檯它仍然顯示我登錄而不是溢價或我溢價,這是,如果我在我登錄的唯一情況。

回答

1

而不是使用req.logout()嘗試使用下面的代碼片段

+0

感謝這解決了這個問題,也是另一個問題,即後退按鈕後退出是讓我登錄。 –

+0

一件事如何使用Flash的消息吧。現在閃存味精正在導致錯誤req.flash需要會話,雖然我的快車應用程序正在使用快速會話。 @Urvish –

+0

1.註銷後的後退按鈕讓我登錄 - 每個頁面上必須有一個終點,您檢查用戶是否登錄。如果用戶沒有登錄,那麼它應該返回401或一些修復代碼。在客戶端代碼中寫入一個響應攔截器,如果任何響應返回401,則將其重定向到登錄頁面。 –

0

試試這個代碼在節點我們登錄後用戶設置會話,破壞同樣會註銷用戶

//logout route 
router.get('/logout',function(req,res){ 
    req.session.user = ''; 
    res.redirect('/login'); // redirect wherever required 
}); 
0

我有類似的問題,並找到答案從http://www.passportjs.org/docs/logout/

app.get('/logout', function(req, res){ 
    req.logout(); 
    res.redirect('/'); 
}); 

或情況你有一個註銷頁面。

app.get('/logout', function(req, res){ 
    req.logout(); 
    res.render('logout', { 
      title: "Moi moi!" 
     }); 

    });