0

Accounts API を使用してユーザーを管理しています。私のアプリは、最初に資格情報を使用してユーザーのログインを試みます。エラーが発生した場合は、入力された資格情報を使用して新しいユーザー アカウントを作成します。

// Log the user in
Meteor.loginWithPassword(username, token, function(error) {
    if(error) { // create a new user account, log them in and show the page
        Accounts.createUser({
            username: username,
            email: username + '@example.com',
            password: token,
            profile: {name: username}
        }, showThePage);
    }
    else { // show the page
        //showThePage();
        window.location.reload();
    }
});

ただし、このコード ブロックは、ユーザーが以前にブラウザからログアウトした場合にのみ実行されます。その場合、Meteor が を使用してユーザーをログインさせるのに 2 ~ 3 秒かかりますloginWithPassword。v0.5.0 を使っているので はなくMeteor.loggingIn()、しかありませんMeteor.userLoaded()。何らかの理由で、Meteor はログイン操作を 2 回実行します。1 回目はプレースホルダー ユーザー (userId プロパティのみが設定されています) をロードし、2 回目は実際のユーザーをロードします。これにより、userLoaded() がtrue2 回返されるため、ローダー イメージが期待どおりに機能しません。

また、loginWithPassword 内の else ブロックで、ウィンドウのリロードを行っていることにも注意してください。showThePage()すべてのテンプレート データとイベント バインディング コードを含む関数があります。この関数は、ログインしているユーザーのユーザー名を使用してデータを取得します。ここで、else ブロック内の関数が実行されるときに実際のユーザーがログインしていないため (Meteor はユーザーのログインに時間がかかることに注意してください)、データは取得されません。

この問題の回避策はありますか?

4

2 に答える 2

0

本当に 0.5.1 に更新できない場合は、セッション変数を使用してloggingIn、呼び出しとコールバックの間に格納しloginWithPasswordます。

Session.set('loggingIn',true);
Meteor.loginWithPassword(...
  Session.set('loggingIn',false);
});

次に、必要に応じてSession.get('loggingIn')呼び出しを使用します。

userLoaded()代わりに適応したいですか?

var userLoadedTimes = 0; // can't use session variable because it would mess up reactive context on increments
Session.set('loggingIn',false);
Meteor.autorun(function () {
  var userLoaded = Meteor.userLoaded(); // reactive.
  if (userLoaded)
    userLoadedTimes++;
  if ((userLoadedTimes % 2 == 0) && (userLoadedTimes != 0))
    Session.set('loggingIn',true);
  else
    Session.set('loggingIn',false);
});

そのモジュロはそこで何をしているのですか?なんらかの理由でリアクティブ コンテキストが 2 回呼び出された場合userLoaded、実際にログインしたことになりますuserLoadedTimes。それ以外の場合、つまりuserLoadedTimesが奇数 ( userLoadedTimes % 2 == 1) の場合は、偽のユーザーを見ています...つまり、まだ本物のユーザーを読み込んでいるということです!

これが機能しない場合は、Meteor がloginWithPasswordコールバックを 2 回呼び出すイベントで、コールバックのセッション変数の変更を使用して、偶数/奇数ロジックを最初のソリューションに適用します。

于 2012-12-13T10:00:59.897 に答える
0

まず、Meteor.userLoaded は、0.5.0 を超えてアップグレードすると消えます。Meteor.userId() === null を確認して、ユーザー ログインが完了したかどうかを確認する必要があります。これは 0.5.0 以降で機能します。ご指摘のとおり、複数回呼び出される場合がありますが、実際の値がある場合にのみログインが完了します。

于 2012-12-07T11:22:29.140 に答える