0

우선, 나는 Meteor 자체를 사용하지 않고 Angular-Meteor를 사용하므로 원리는 동일합니다. 내가 할 필요가있는 것은 자원이 유효 할 때 helper 함수에서 유효성을 검사하고 결과에 따라 결정을 내리는 것입니다.meteor 도우미에서 쿼리 결과의 유효성을 검사하고 404로 리디렉션하는 방법은 무엇입니까?

나는 클라이언트 측에서 findfindOne 콜렉션의 기능이 동기식이라고 생각했지만, 그렇지 않거나 잘못된 방식으로 작업하고있는 것으로 보입니다.

this.helpers({ 
     post() { 
     let _post = Posts.findOne({ 
      _id: this.postId 
     }); 

     if(typeof _post == 'undefined') 
      return this.$state.go('404'); 

     return _post; 
     } 
    }); 

this.postId가 URL PARAMS에서 온다 :

나는 다음과 같은 코드가 있습니다. 앱을 탐색 할 때 모든 작업이 수행됩니다. 그러나 페이지를 새로 고치면 this.postId이 정의되어 있지만 Posts.find()undefined을 반환하며 분명히 404 페이지로 이동합니다.

¿이 시나리오에서 어떻게 해결할 수 있습니까?

답변

1

페이지를 새로 고치면 클라이언트에 데이터를 보내기 전에보기가 렌더링되기 때문입니다. 이 문제를 해결하려면 데이터가 존재하는지 확인하기 전에 데이터가 준비되어 있는지 확인해야합니다.

const handle = Meteor.subscribe('data'); 

if (handle.ready()) { 
    const post = Posts.findOne(/**/); 

    if (typeof post === 'undefined') { 
    console.log('post does not exist'); 
    } 
} 
+0

정답입니다. 도우미 코드를 handle.ready()에 래핑하면 항상 데이터가 준비되었는지 확인할 수 있습니다. 고맙습니다. – Brian

0

@Khang 뷰는 데이터가 준비되기 전에 렌더링되는 대한 올바른 : 즉, 가입 준비 경우 데모로이 코드를 사용, 확인하는 것을 의미합니다.

이 작업을 수행하는 또 다른 방법은 사용 반응성 변수를 사용하는 것입니다 this.getReactively()

이 도우미를 보는 방법입니다 :

this.helpers({ 
    post() { 
    let _post = Posts.findOne({ 
     _id: this.getReactively('postId') 
    }); 

    if(typeof _post == 'undefined') 
     return this.$state.go('404'); 

    return _post; 
    } 
}); 

도우미를 처음 실행하고 데이터 전에, 즉 아무것도 (반환하지 않습니다 이 코드는 일반적인 경우처럼 처리해야합니다 ($state.go('404')을 수행하지 마십시오)

this.postId을 생성자에 선언해야합니다. 그렇지 않으면 getReactively()은 일.

+0

문제는 항상 정의 되었기 때문에 this.postId가 아닙니다. this.postId는 URL 상태 매개 변수에서옵니다. – Brian

+0

언제나 정의되어 있으면 좋습니다. getReactively를 사용하면 Meteor가'this.postId'에 watch를 놓는다. 즉, 헬퍼가 바뀌면 자동으로 실행된다. 그렇지 않으면 사용자가 새 게시물을 선택했을 때 직접해야합니다. – Mikkel