【问题标题】:Meteor.user() always nullMeteor.user() 始终为空
【发布时间】:2015-01-17 04:18:10
【问题描述】:

我是一名新手 JS 开发人员,我正在尝试开发 Meteor 应用程序。 我实际上是在尝试使用 Meteor 的 Account 包。我遵循了这个非常清楚的教程:http://blog.benmcmahen.com/post/41741539120/building-a-customized-accounts-ui-for-meteor

这是我的登录页面(在 Jade 中):

template(name='login')
  div.container
    +menuLogin

    +form_signin


template(name="form_signin")
  form.form-signin(role="form" method="post" action="" id="form-signin" data-toggle="validator")
    h2.form-signin-heading Connexion
    input.form-control(type="text" placeholder="Nom d'utilisateur" name="userName" autofocus="" required )
    input.form-control(type="password" placeholder="Mot de passe" name="password" required )

    +profil_choice

    button.btn.btn-primary.btn-lg.btn-block.btn-connection(type="submit") Connexion
    div.alert.alert-danger.alert-dississible(id="alert-login" role="alert") 
        button.close(type="button" data-dismiss="alert")
            span(aria-hidden="true") ×
            span.sr-only Close
        p(id="alert-login-text")

还有 JavaScript :

Profils = new Mongo.Collection('profils');
Meteor.subscribe('profils');
Meteor.subscribe('users');

var userCursor = Meteor.users.find();
var handle = userCursor.observe({
  changed: function (tmp){
    console.log(tmp);
    Router.go('start');
  }
})

var trimInput = function(val){
  return val.replace(/^\s*|\s*$/g, "");
}

Meteor.autorun(function (){
  var message = Session.get('errorMessage');
  if (message){
    $('#alert-login-text').text(message);
    $('#alert-login').show(200).delay(3000).hide(200);
    Session.set('errorMessage', null);
  }
});

var checkLoginParams = function(userName, password, profil){
  if (profil == ""){
    Session.set('errorMessage', "Veuillez selectionner un profil !");
    return false;
  }
  return true;
}

Template.form_signin.events({
  'submit form': function (event, template){
    event.preventDefault();

    var userName = template.find("input[name=userName]").value;
    var password = template.find("input[name=password]").value;
    var profil = template.find("input[name=profilName]").value;

    var username = trimInput(userName);
    console.log("user : " + username + "  password : " + password);

    if (checkLoginParams(username, password, profil) == false){
      return;
    }

    Meteor.loginWithPassword(username, password, function (error){           
      if (error){
        Session.set('errorMessage', "Nom d'utilisateur ou mot de passe incorrect");
        console.log(error.reason);
      }
    });
    return false;
  }
});

当我在数据库上更改对象用户时,我实际上是在更改模板(使用 Iron 路由器),因为无论我是否登录,我都找不到任何其他东西来通知我。

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

Router.route('start',{
  path: 'start',
  onBeforeAction: function () {
    if (Meteor.user()){
      this.render('start');
    }
    else{
      if (Meteor.loggingIn()){
        this.render('start');
      }
      else{
        Router.go('login');
      }
    }
  }
});

问题是,无论我在哪里调用 Meteor.user(),它总是为空。所以...我显然没有连接。

数据库中只有一个用户,我确定连接参数是好的。

此外,为什么我不能在 loginWithPassword() 回调中执行 Router.go('start') ?

编辑:这是我在服务器端创建的用户

if (Meteor.isServer) {
  Meteor.startup(function() 
  {
    Accounts.createUser({
        username : "admin",
        password : "123",
        email : "test@test.fr",
        isAdmin : true
  });
});

【问题讨论】:

  • 有趣的事实:今天早上我刷新了我已经打开了一夜的页面和奇迹!我可以使用 Meteor.user() 检查我的用户,我得到一个具有正确用户名(“admin”)的对象。所以...连接很好,但服务器需要几分钟才能了解用户已连接...?

标签: javascript meteor meteor-accounts


【解决方案1】:

您没有创建用户,因此您无法登录不存在的帐户 http://docs.meteor.com/#/full/accounts_createuser

您可以为登录创建回调,例如:

if (error)
        {
            console.log(error.reason);
        }

并且会弹出用户不存在的错误

【讨论】:

  • 我在服务器代码中创建了一个用户'admin'。使用 minimongo shell,我可以看到当我使用 loginWithPassword() 时,用户被修改了。添加了一个带有登录日期和令牌的对象。
  • 那么,它不会返回错误吗? loginWithPassword 是否正在启动?提交此表单后,尝试在控制台输入 Meteor.user()
  • 我没有尝试在控制台中输入..但是下周一我会尝试(我是兼职学生^^)顺便说一下,调用代码中的方法应该有同样的结果吗?我在同一个模板和另一个模板中尝试了 Meteor.user() 但它总是返回 null。
  • 我真的不明白 Meteor 是如何工作的:/ 我调用 loginWithPassword 并且我可以在数据库中看到该方法做了一些事情,每次都会添加一个 loginTokens ......但是 Meteor.user()并且控制台(或代码中)中的 Meteor.userId() 返回 null。所以......我做错了什么吗?我是否必须捕获 loginWithPassword 的一些结果并将其存储在某个地方?
  • 没有,但是您是否按照我告诉您的方式进行了回电?如果 loginWithPassword 有效但未登录,则应该有我之前写的 error.reason。
【解决方案2】:

通过更新我的 Meteor 版本解决了这个问题。其实……我真的不明白出了什么问题。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2019-07-18
    • 2019-08-18
    • 2011-12-29
    • 2019-07-02
    • 2019-05-04
    • 1970-01-01
    • 2011-05-04
    • 2015-10-29
    相关资源
    最近更新 更多