Автозапуск трекера с использованием findone - PullRequest
0 голосов
/ 28 июня 2018

У меня есть этот кусок кода на стороне клиента:

Tracker.autorun(function () {
    if (params && params._id) {
        const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
        if (dept) {
        }
    }
});

параметры будут переданы в URL. Итак, изначально у нас не будет данных отдела, и метод findOne вернет значение null, а затем, когда поступят данные, мы сможем найти объект отдела.

Но если пользователь вводит неверный идентификатор, нам нужно вернуть его 404. Используя автозапуск трекера, как я могу различить 2 случая:

а. Данных пока нет, поэтому findOne возвращает null

б. Таких данных нет даже в mongodb сервера, поэтому findOne также возвращает ноль.

Для случая a автозапуск трекера будет работать нормально, но для случая b мне нужно знать, чтобы вернуть 404

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Если вы используете Iron-Router, вы можете попробовать этот взлом.

Router.route('/stores', function() {
    this.render('stores', {});
}, {
    waitOn: function() {
        return [
            Meteor.subscribe('stores_db')
        ];
    }
});

Приведенный выше пример кода будет ожидать завершения подписки "stores_db", прежде чем что-либо делать. Тогда вы можете без проблем использовать свою findOne логику, гарантируя, что все документы доступны. Это соответствует вашей ситуации.

Это то, что я делал до того, как полностью понял публикации и подписки MeteorJS. Я не рекомендую свое решение, оно очень плохо для пользователя. Пользователи будут видеть загрузку страницы навсегда, пока загружаются документы. @Sasikanth дал правильную реализацию.

0 голосов
/ 28 июня 2018

Я бы предложил вам подписаться на данные внутри шаблона, как показано ниже, чтобы вы знали, когда подписки готовы, тогда вы можете проверить, существуют ли данные или нет

Template.myTemplate.onCreated(function onCreated() {
  const self = this;
  const id = FlowRouter.getParam('_id');
  self.subscribe('department', id);
});


Template.myTemplate.onRendered(function onRendered() {
  const self = this;
  // this will run after subscribe completes sending records to client
  if (self.subscriptionsReady()) {
    const id = FlowRouter.getParam('_id');
    const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
    if (dept) {
      // found data in db
    } else {
      // 404 - no department found in db

    }
  }
});
...