“在流星线路中无法读取未定义的属性'用户名'?

时间:2015-04-21 18:43:34

标签: meteor iron-router

该页面仍然按原样呈现,但这会显示在我的控制台日志中。

  

异步函数回调中的异常:TypeError:无法读取   property' username'未定义的       在null。 (http://localhost:3000/router.js?39194109cc7760190c519a386d66c807ba19230c:48:9)       at boundNext(http://localhost:3000/packages/iron_middleware-stack.js?0e0f6983a838a6516556b08e62894f89720e2c44:424:31)       在Meteor.bindEnvironment(http://localhost:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:983:22)       在onRerun(http://localhost:3000/packages/iron_router.js?a427868585af16bb88b7c9996b2449aebb8dbf51:520:9)       at boundNext(http://localhost:3000/packages/iron_middleware-stack.js?0e0f6983a838a6516556b08e62894f89720e2c44:424:31)       在Meteor.bindEnvironment(http://localhost:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:983:22)       在onRun(http://localhost:3000/packages/iron_router.js?a427868585af16bb88b7c9996b2449aebb8dbf51:505:11)       at boundNext(http://localhost:3000/packages/iron_middleware-stack.js?0e0f6983a838a6516556b08e62894f89720e2c44:424:31)       在Meteor.bindEnvironment(http://localhost:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:983:22)       在派遣(http://localhost:3000/packages/iron_middleware-stack.js?0e0f6983a838a6516556b08e62894f89720e2c44:448:3

哪个指向下面的行:

var OnBeforeActions = {
  loginRequired: function() {
    if (!Meteor.userId()) {
      this.render('hello');
    } else {
      this.next();
    }
  }
};
Router.onBeforeAction(OnBeforeActions.loginRequired, {
  only: ['home']
});

Router.route('/', function() {
  // this.render('homepage');
  Router.go('/users/' + Meteor.userId());
});

Router.route('/users/:user_id', function() {
  this.render('home', {
    data: {
      username: Meteor.users.findOne({
        _id: this.params.user_id
      }).username, // THIS LINE HERE
    }
  });
});

如果用户已经登录,他的想法是将用户重定向到他的页面 - 它似乎应该正常工作,但为什么我会这样做呢?

1 个答案:

答案 0 :(得分:4)

当浏览器最初加载时,将不会有任何可用数据(所有集合都将为空 - 直到它们被下载。因此查询Meteor.users.findOne({_id: this.params.user_id})的结果将为undefined

这是您无法从username中读取undefined的原因。

由于查询将重新运行/它是被动的,您只需要在它为空时考虑它并将自行排序。仅当用户不是user.username时才会读取null

Router.route('/users/:user_id', function() {
  var user = Meteor.users.findOne({_id :this.params.user_id});
  this.render('home', {
    data: {
      username: user && user.username
    }
  });
});