Meteor.user()不等待使用Iron Router RouteController加载onBeforeAction

时间:2015-01-19 01:58:12

标签: meteor iron-router

我正在尝试加载登录用户的以下用户的食谱(如Twitter的家庭Feed)。 我正在使用Iron-Router RoutController。

我想查询用户在订阅中的以下用户的食谱&数据如:

Recipes.find({
  author: {
    $in: Meteor.user().followings
  }
}, this.findOptions);

但即使我使用'obBeforeAction','Meteor.user()'也是未定义的。 部分Meteor.subscribe("followingRecipes", Meteor.user().followings, @findOptions()) 并且Recipes.find author: $in: Meteor.user().followings ...未定义。

我是Meteor的新手,我需要帮助,请帮助我,谢谢。

我的整个代码(CoffeeScript):https://github.com/yhagio/re-cip/tree/style2

lib/router.coffee

//lib/router.js
FollowingRecipesController = RouteController.extend({
  template: 'followingRecipes',
  increment: 5,
  onBeforeAction: function() {
    if (!Meteor.user()) {
      this.render(this.loadingTemplate);
      if (Meteor.loggingIn()) {
        this.render(this.loadingTemplate);
      } else {
        Router.go('/');
      }
    } else {
      this.next();
    }
  },
  postsLimit: function() {
    return parseInt(this.params.postsLimit) || this.increment;
  },
  findOptions: function() {
    return {
      sort: {
        submitted: -1,
        votes: -1,
        _id: -1
      },
      limit: this.postsLimit()
    };
  },
  subscriptions: function() {
    console.log('subscriptions:', Meteor.user());
    this.recipesSub = Meteor.subscribe("followingRecipes", Meteor.user().followings, this.findOptions());
  },
  recipes: function() {
    console.log('recipes:', Meteor.user());
    Recipes.find({
      author: {
        $in: Meteor.user().followings
      }
    }, this.findOptions);
  },
  nextPath: function() {
    return Router.routes.followingRecipes.path({
      username: this.params.username,
      postsLimit: this.postsLimit() + this.increment
    });
  },
  data: function() {
    var hasMore;
    hasMore = this.recipes().count() === this.postsLimit();
    return {
      recipes: this.recipes(),
      ready: this.recipesSub.ready,
      nextPath: (hasMore ? this.nextPath() : null)
    };
  }
});

server/publications.coffee

//server/publications.coffee
Meteor.publish('followingRecipes', function(followings, options) {
  return Recipes.find({
    author: {
      $in: followings
    }
  }, options);
});

2 个答案:

答案 0 :(得分:1)

我不是一个coffescript人,但我可以尝试解释一下这个错误

    Route dispatch never rendered. Did you forget to call this.next() 
   in an onBeforeAction?

阅读铁路由器文档的自述文件

https://github.com/EventedMind/iron-router#migrating-from-094

来自文档

onRun和onBeforeAction挂钩现在要求你调用this.next(),不再采用pause()参数。因此默认行为是相反的。例如,如果你有:

Router.onBeforeAction(function(pause) {
  if (! Meteor.userId()) {
    this.render('login');
    pause();
  }
});

您需要将其更新为

Router.onBeforeAction(function() {
  if (! Meteor.userId()) {
    this.render('login');
  } else {
    this.next();
  }
});

这意味着你在onBeforeAction函数的任何地方,如果你想要继续流程,就像你想要在检查用户登录后运行钩子(action,onAfterAction),你需要写this.next()到继续流程

Ex代码

 Router.onBeforeAction(function() {
      if (! Meteor.user()) {
        this.render('login');
      } else {
        this.next();
      }
    });

在上面的代码中,如果用户已登录,则流程将继续并执行下一个功能,如action,data,onAfetrAction,否则将呈现登录模板

答案 1 :(得分:1)

是否因为客户端尚未知道用户集合? 在waitOn函数中订阅客户端。

类似的东西:

  this.route('myaccount',{
    waitOn: function() {
      Meteor.subscribe('experts-all'); // users
    },
    onBeforeAction: function () {
      if (!Meteor.user()) {
        Router.go('signin');
      }
      else this.next();
    },
    template: 'myAccount',
  });