2017-05-07 1 views
0

사용자 인증을 확인한 다음 해당 계정의 상태를 확인하는 내 /app 경로가있는 두 개의 미들웨어를 사용하려고합니다. 두 미들웨어를 모두 가지고 있지만, 내 req.session.accountStatus이 제공 한 조건과 같지 않은 경우 무한 리디렉션으로 실행됩니다. 일반적으로 사용자가 리디렉션되는 페이지에만 액세스하도록해야합니다. 미들웨어를 잘못 사용하고 있습니까? 더 나은 접근 방법이 있습니까?ExpressJS - 미들웨어 리디렉션이 너무 많습니다.

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()){ 
     return next(); 
    } 
    res.redirect('/login'); 
} 

function accountStatus(req, res, next) { 
    if(req.session.accountStatus == "active" || req.session.accountStatus == "trialing"){ 
     return next(); 
    } else { 
     //Endless loop. Need to fix 
     res.redirect('/app/settings/billing'); 
    } 
} 

router.use(require('./site-routes')); 
router.use('/app', isLoggedIn, accountStatus, require('./app-routes')); 

답변

2

아마도 미들웨어를 app-router.js으로 옮기는 편이 쉽습니다.

그래서 당신의 주요 파일은이 작업을 수행 할 것입니다 :

router.use('/app', require('./app-routes')); 

app-routes.js 먼저 "열기"이어야 URL의 경로를 추가; 제한적인 미들웨어 이어

router.get('/settings/billing', ...); 

: 경로의 나머지 얹는

router.use(isLoggedIn, accountStatus); 

.

그런 식으로 /app/settings/billing에 대한 요청은 미들웨어를 전혀 통과하지 않으며 리디렉션 루프를 발생시키지 않습니다.

isLoggedIn 경우 /app로 시작하는 경로, 당신은 비슷한 방법으로 사용할 수 있습니다 을 위해 필수입니다 :

router.use(isLoggedIn); 
router.get('/settings/billing', ...); 
router.use(accountStatus); 
router.get(...); 
+0

이 훌륭한 솔루션입니다! 두 가지 빠른 질문을 통해 도움을받을 수 있습니다. 1.'/ login'은 제 'site-routes.js' 파일에 정의 된 경로입니다. 'app-routes.js' accountStatus 미들웨어 내에서이 경로로 리다이렉트를 추가 함에도 불구하고 두 파일 모두'router'에'.use'를 통해 첨부되기 때문에 라우트를 인식해야합니다, 맞습니까? 2. '설정/결제'가 'accountStatus' 미들웨어에 고정되어 있다고해도'라우터 '에 연결되어있어 여전히 전역 적으로 액세스 할 수 있습니까? – cphill

+0

1. 예, 리디렉션은 클라이언트가 다른 페이지로 "이동"하기위한 지침입니다. 해당 페이지가 존재하는 한 제대로 작동합니다. 익스프레스에서 수행 한 "특수 처리"는 없습니다. 2. "미들웨어에 고정"이라는 의미가 무엇인지 모릅니다. '/ app/settings/billing'이 호출 될 때'accountStatus' 미들웨어가 호출되어서는 안됩니다 (적어도 당신이 원하는 것입니까, 아니면 질문을 오해 했습니까?). – robertklep

+0

아니, 모두 의미가 있습니다. 도와 주셔서 정말 감사합니다! – cphill

관련 문제