【问题标题】:"Cannot read property 'username' of undefined" in a Meteor Route?流星路线中的“无法读取未定义的属性'用户名'”?
【发布时间】:2015-04-22 02:51:05
【问题描述】:

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

异步函数回调中的异常:TypeError:无法读取 未定义的属性“用户名” 在空。 (http://localhost:3000/router.js?39194109cc7760190c519a386d66c807ba19230c:48:9) 在 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) 在 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) 在 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
    }
  });
});

这个想法是如果用户已经登录,则将他重定向到他的页面 - 它似乎可以正常工作,但为什么我会得到这个?

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

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

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

    由于查询将重新运行/它是反应式的,您只需要考虑它何时为空,它会自行排序。 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
        }
      });
    });
    

    【讨论】:

    • 太棒了,谢谢你的sn-p和详尽的解释。只是好奇 - 你怎么知道它只有在不为 null 时才会被读取?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多