2017-05-19 10 views
0

ユーザがMeteorアプリケーションにログインしてDDP接続を失って回復した場合、クライアントがログインする前にサーバーは実行します。Meteor minimongoは、サーバの前にクライアントにログインしたユーザを示します

例えば、IはMeteor.loggingIn()の結果に応じて更新するコンテナコンポーネントを有する:MainNavigation成分で

const MainNavigationContainer = createContainer(props => { 
    return { 
     meteorReady: Meteor.loggingIn() === false 
    } 
}, MainNavigation); 

を、私は(ユーザの_idに基づいて結果を返す必要が流星方法を実行I )無関係なコードを削除することを試みた:Meteor.user()が定義されている場合

class MainNavigation extends Component { 
    componentWillReceiveProps(nextProps) { 
     this.setInitialRoute(nextProps); 
    } 
    setInitialRoute = (props) => { 
     // Set up initial route 
     if (props.meteorReady) { 
      if (!Meteor.user()) { 
       this.setState({initialRoute: routes[1]}); 
      } else { 
       Meteor.call('/user/events/isActive', (e, eventId) => { 
        if (eventId) { 
         // Do some stuff 
        } else { 
         // Do some other stuff 
        } 
       }); 
      } 
     } 
    }; 
    render() { 
     return (
      this.props.meteorReady && this.state.initialRoute ? 
      <Navigator 
       ref={navigator => this.navigator = navigator} 
       initialRoute={this.state.initialRoute} 
       renderScene={(route, navigator) => { ... }} 
      /> : (
       <View style={styles.container}> 
        <ActivityIndicator animating={true}/> 
       </View> 
      ) 
     ) 
    } 
} 

/user/events/isActiveメソッド呼び出しは、実行されるべきである(ユーザーがログインしている平均べきです)。しかし、私は、サーバーの呼び出しを見て:(DDP切断と再接続後に)この方法の

Meteor.methods({ 
    '/user/events/isActive': function() { 
     console.log('userId:', this.userId); 
     if (this.userId) { 
      const member = Members.findOne({userId: this.userId}); 
      if (member) { 
       return member.eventId; 
      } 
      return false; 
     } 
     return false; 
    } 
}); 

最初の呼び出しはthis.userIdnullに等しいで終わります。

基本的に、Meteor.user()がクライアントに定義されている場合、サーバー上にはthis.userIdが定義されています。しかし、クライアント上のminimongoは、実際にログインする前に(接続を切断して再接続したとき)、偽陽性を示しているようです。

私の質問は:クライアントにMeteor.user()が定義されている場合、サーバでthis.userIdが定義されていると思っても問題ありませんか?現在のところ、私はできないと言っています。それで、ユーザーが本当にクライアント側からログインしているかどうかを確実に判断する方法はありますか?

+0

あなたのメソッドで 'this.userId'の代わりに[' Meteor.userId() '](http://docs.meteor.com/api/accounts.html#Meteor-userId)を試してみたらどうでしょうか? – ghybs

答えて

0

多くのデバッグの後、私は最終的に何が起こっているかを把握しました。

containerは、無効な計算が無効にされるたびに新しい子要素を子コンポーネントに送信します。また、Meteorメソッドは非同期であり、サーバー上で解決されない場合、クライアントは再接続するまで応答を取得しようとし続けます。ただし、setInitialRouteに渡されるpropsは、からcomponentWillReceivePropsまでです。

それで、流星サーバーが切断されてコールが正しく行われ、再接続後にその呼び出しが解決されたということが起こりました。だから、流星法の以前の呼び出しは、this.userIdのために私にnullを与えて評価されていました。

これを解決するために、私は、ユーザーが実際に(現在の小道具を使用してではなく、nextPropsに渡された)に記録されたときに、それが評価されたことを確認するために、流星メソッドのコールバックの中に条件を入れていた:

Meteor.call('/user/events/isActive', (e, eventId) => { 
    if (this.props.meteorReady) {...} 
}); 

これは、メソッド呼び出しの結果がクライアントで評価されるのを防ぎ、私の問題を解決します。

関連する問題