如何在meteor helper中验证查询结果并重定向到404?

时间:2017-01-21 04:12:20

标签: javascript angularjs meteor angular-meteor meteor-collections

首先,我本身并没有使用Meteor,而是使用Angular-Meteor,所以原理是一样的。我需要做的是在资源有效或无效时在helper函数中进行验证,并根据其结果做出决定。

我认为findfindOne集合的功能在客户端是同步的,但似乎它们不是,或者我是以错误的方式做事情。

我有以下代码:

this.helpers({
      post() {
        let _post = Posts.findOne({
          _id: this.postId
        });

        if( typeof _post == 'undefined' )
          return this.$state.go('404');

        return _post;
      }
    });

this.postId来自Url params。当我浏览应用程序时,所有工作。但是,当我刷新页面时,this.postId已定义但Posts.find()返回undefined,显然,它会转到404页面。

¿我怎样才能解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

这是因为刷新页面时,会在将数据发送到客户端之前呈现视图。要解决此问题,您需要确保数据准备就绪,然后再检查它是否存在。换句话说,它意味着要检查您的订阅是否准备就绪,请将此代码用作演示:

const handle = Meteor.subscribe('data');

if (handle.ready()) {
  const post = Posts.findOne(/**/);

  if (typeof post === 'undefined') {
    console.log('post does not exist');
  }
}

答案 1 :(得分:0)

@Khang在数据就绪之前呈现的视图是正确的。

另一种方法是使用this.getReactively()

使用反应变量

这就是你的助手的样子:

this.helpers({
  post() {
    let _post = Posts.findOne({
      _id: this.getReactively('postId')
    });

    if( typeof _post == 'undefined' )
      return this.$state.go('404');

    return _post;
  }
});

帮助程序将首次运行并且不返回任何内容(即在数据准备好之前),因此您的代码应该将其作为正常情况处理(不要执行$state.go('404')

请记住在构造函数中声明this.postId,否则getReactively()无法正常工作。