0

Прежде всего, я не использую Метеор сам по себе, а Angular-Meteor, поэтому принципы одинаковы. Что мне нужно сделать, это проверить в helper функцию, когда ресурс действителен или нет, и принять решение на основе его результата.Как проверить результат запроса в метеорном помощнике и перенаправить на 404?

Я подумал, что функции коллекции find и findOne являются синхронными на стороне клиента, но, похоже, они не являются или я делаю то, что неправильно.

У меня есть следующий код:

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.

¿Как я могу организовать обход для этого сценария?

ответ

1

Это связано с тем, что когда вы обновляете страницу, ваше представление визуализируется до отправки данных клиенту. Чтобы обойти это, вам нужно убедиться, что данные готовы, прежде чем проверять его существование. Другими слова, это означает, чтобы проверить, если ваша подписка будет готова, используйте этот код в качестве демонстрации:

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

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

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

Правильный ответ. Объединяя хелпер-код в handle.ready(), мы всегда можем убедиться, что данные готовы. Спасибо. – Brian

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() не будет Работа.

+0

Проблема не в this.postId, потому что она всегда определена. This.postId исходит из параметров состояния URL. – Brian

+0

Это хорошо, если оно всегда определено. используя getReactively заставляет Meteor размещать часы на 'this.postId' - это означает, что помощник будет запускаться автоматически, когда он изменится. В противном случае вам нужно сделать это самостоятельно, когда пользователь выбрал новое сообщение – Mikkel