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 执行了两次登录操作——一次通过加载占位符用户(仅设置了其 userId 属性),另一次通过加载实际用户。这使得 userLoaded() 返回true两次,因此我的加载器图像无法按预期工作。

另请注意,在 loginWithPassword 内的 else 块中,我正在重新加载窗口。我有一个showThePage()包含所有模板数据和事件绑定代码的函数。该函数使用登录用户的用户名检索数据。现在因为当 else 块中的函数执行时没有真正的用户登录(记住流星需要时间来登录用户),所以没有数据被获取。

有解决此问题的方法吗?

4

2 回答 2

0

首先 Meteor.userLoaded 在你升级到 0.5.0 之后就会消失。您应该检查 Meteor.userId() === null 以了解用户登录是否已完成,这适用于 0.5.0 及更高版本。正如您所指出的,它可能会被多次调用,但只有当它具有实际值时才会完成登录。

于 2012-12-07T11:22:29.140 回答
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);
});

那个模在那里做什么?好吧,如果userLoaded由于某种原因两次调用了响应式上下文,那么您实际上已经登录了。所以我们检查是否userLoadedTimes是 2 的倍数/偶数。所有其他时间,即userLoadedTimes奇数(userLoadedTimes % 2 == 1)时,我们正在查看假用户......这意味着我们仍在加载真实用户!

如果这不起作用,请使用回调上的会话变量更改将偶数/奇数逻辑应用于第一个解决方案,以防 Meteor 调用loginWithPassword回调两次。

于 2012-12-13T10:00:59.897 回答