2015-01-31 1 views
1

나는 기본 응용 프로그램을 설정하고 있습니다. 내가 길을 가득 채우고 사용자가 로그인했는지 확인하는 onBeforeAction을 가지고 있는데 그렇지 않다면 this.layout()을 사용하여 특별한 레이아웃 내에서 Login 템플릿을 렌더링한다.Meteor.user()가 유효 할뿐만 아니라 모든 것을 검사하기 전에 Route

또한 내 기본 layoutTemplate, loadingTemplate 및 notFoundTemplate을 Router.configure()에서 설정합니다. 내가 아는 한 모든 것을 달리 정의하지 않는 모든 Route에 대해 기본값을 설정합니다.

기본적으로 모든 것이 한 가지 예외로 작동합니다. 404 이벤트의 경우 onBeforeAction이 호출되지 않습니다. 그러면 내 404 템플릿이 기본 레이아웃으로 렌더링됩니다. 내 목표는 기존 경로가 아닌 곳에서도 로그인 확인을하는 것입니다.

어떻게 처리 할 수 ​​있습니까?

답변

0

나는 똑같은 문제가 있었고 이것은 나를 위해 일했습니다.

기본적으로 catchall 경로는 사용자가 로그인 한 경우 다음()을 호출하면 로그인 템플릿을 리디렉션하지 않거나 원하는대로 렌더링하지 않는 경우 사용자가 로그인했는지 확인하는 데에만 사용됩니다. 물론 모든 경로의 마지막에 위치해야합니다.

notFoundTemplate을 설정하기 위해 Router.configure()를 사용하는 대신 catchall 라우트에서 렌더링하십시오. 마지막 경로로 유지하면 일치하는 경로가 없으며 notFoundTemplate을 렌더링하는 올바른 위치가됩니다.

이 예제에서는 URL을 세션 객체에 저장하여 액세스를 시도한 경로로 사용자를 리디렉션 할 수 있지만 원래 this.redirect ('auth')를 사용하여 리디렉션했습니다. 로그인을위한 별도의 경로 - 그건 단지 개인적인 취향이다. 그러나 나는 유용하다고 생각하여 코드에 보관했다. 플리커에 관해서

Router.onBeforeAction(function() { 

    if(!Meteor.user() && !Meteor.loggingIn()){ 

     Session.set('returnUrl', Router.current().url); 
     this.render('auth'); 

    } else { 
     this.next(); 
    } 

}, {except: ['auth']}); 


Router.route('/auth', function() { 
    this.render('auth'); 
}); 

Router.route('/(.*)',function(){ 
    this.render('notFoundTemplate'); 
    }); 

업데이트

, 내가! Meteor.loggingIn()를 체크했다. 또한 코드를 약간 정리하고 인증 경로에서 onBeforeAction을 실행하지 않으려면 'except'매개 변수를 사용했지만 필요 없으므로이를 제거하면됩니다.

+0

나는 그 잡다한 길을 알지 못했습니다. 그리고 그것은 좋은 출발입니다. 내 설정은 비슷하지만 리디렉션을 사용하지 않지만 로그인 템플릿을 직접 렌더링합니다. 그 결과, 로그인 한 사용자는 기존의 경로를 입력 할 때 로그인 템플릿을 보게됩니다. 다시 빠르게 사라지고 빈 페이지가 나타납니다. 그래서이 로그인 템플릿 렌더링을 피하고 대신 404 템플릿을 표시하는 방법을 알아야합니다. – Helmi

+0

사실, 실제로 catchall 경로에 notFoundTemplate을 렌더링 할 수 있습니다. 그 경로에 도달하면 일치하는 경로가 없기 때문입니다. 그런 다음 Router.configure()에서 notFoundTemplate 구성을 제거하십시오. – cfs

+0

동일한 설정을 시도했지만 동일한 문제가 발생했습니다. 해결 방법은 사용자가 없으면 this.next() 호출을 제거하는 것입니다 (업데이트 된 코드 참조). – cfs