2016-08-04 4 views
0

Использование Meteor Я пытаюсь захватить и сохранить некоторые данные (имя, адрес электронной почты и возраст) с помощью формы. Эти данные должны быть сохранены в новой коллекции Meteor «Подписчики». Мой код выглядит следующим образом:Сохраните данные формы в коллекции с использованием методов метеорита

шаблона События (клиент \ вид \ subscribe_form \ subscribe_form.js)

Template.Subscribe.events({ 
    'submit form#subscribe-form': function(event){ 
     // Prevent default browser form submit 
     event.preventDefault(); 

     // Get values from the form 
     var subName = $('form#subscribe-form [name=subscribe-name]').val(); 
     var subEmail = $('form#subscribe-form [name=subscribe-email]').val(); 
     var subAge = $('form#subscribe-form [name=subscribe-age]').val(); 

     let subscriberData = { 
      name: subName, 
      email: subEmail, 
      age: subAge, 
      createdAt: new Date() 
     }; 

     // Insert subscriber into the collection 
     Meteor.call('SubscribeNow', subscriberData, function(error, result){ 
      if(error){ 
       // Output error if subscription fails 
       console.log(error.reason); 
      } else { 
       // Success 
       console.log("Subscription successful"); 
       console.log(subscriberData); 
       console.log(Subscribers.find()); 
      } 
     }); 
    }, 
}); 

стороне сервера (сервер \ коллекции \ subscribers.js)

var Subscribers = new Meteor.Collection('subscribers'); 

Subscribers.allow({ 
    insert: function(){ 
     return true; 
    } 
}); 

Meteor.methods({ 
    'SubscribeNow': function (subscriberData) { 
     //check(subscriberData, String); 

     try { 
      // Any security checks, such as logged-in user, validating data, etc. 
      Subscribers.insert(subscriberData); 
     } catch (error) { 
      // error handling, just throw an error from here and handle it on client 
      if (badThing) { 
       throw new Meteor.Error('bad-thing', 'A bad thing happened.'); 
      } 
     } 
    } 
}); 

Теперь, когда я добавляю некоторые данные в форму и нажимаю кнопку отправки, она проходит через сообщение console.log успешного успеха, данные собираются правильно, но всякий раз, когда я пытаюсь запросить коллекцию, она выиграла Ничего не показывать.

Я попытался найти данные в коллекции, используя простой шаблон, который я создал, чтобы перечислить коллекцию подписчиков в таблице, также с помощью Meteor Toys и через console.log(Subscribers.find());, но не повезло. Кажется, что формы проходят, но данные не сохраняются в коллекции.

enter image description here

Кроме того, autopublish и небезопасным удаляются.

enter image description here

Что я делаю неправильно? Я все еще довольно новичок во всем Метеор, так что это может быть что-то очевидное, я здесь отсутствует.

Дайте мне знать, если вам нужно больше узнать о коде. Наконец, любые предложения по улучшению кода (структурированию или такому) приветствуются.

Большое спасибо заранее!

+0

Несколько быстрых заметок: 1. Не просто «разрешить» прямую вставку в коллекцию. Это не требуется для методов на сервере и позволяет любому пользователю вставлять произвольные данные в коллекцию. 2. Обычно вы не имеете доступа ко всей БД со стороны клиента. Это то, что для pub/sub.Если вы хотите знать, какие данные хранятся на сервере, запросите базу данных напрямую (используя «meteor shell», «meteor mongo» или любой инструмент gui/cli, который позволяет вам напрямую обращаться к БД). 3. Подтвердите ввод пользователя на сервере. – MasterAM

+0

Вы абсолютно правы. Я просто использовал 'meteor mongo' для запроса данных, и все там. Так что это должно быть что-то неправильное в списке бит. Я посмотрю. Спасибо за совет. Кроме того, вы сказали, что просто не разрешаете прямое вложение в коллекцию. Какой был бы лучший подход в моем случае? Форма - это, в основном, рассылка бюллетеня, чтобы заявить, поэтому форма является открытой, каждый может представить свою информацию. Теперь в фоновом режиме я просто хочу перечислить «подписчиков». Что бы вы порекомендовали для этого сценария? Я бы очень признателен за пример. Также, если вы можете подробно остановиться на (2), пожалуйста. – Adrian

+0

Для (2) ознакомьтесь с публикациями и подписками. Прочтите [The Meteor Guide] (https://guide.meteor.com/) для получения дополнительной информации. Поскольку вы используете метод, вы можете проверить ввод пользователя перед его вставкой в ​​базу данных. Вероятно, вы не хотите позволять кому-либо хранить что-либо в своей коллекции (кто-то может использовать консоль своего браузера для вызова ваших методов с произвольными данными). – MasterAM

ответ

1

Так из вашего вопроса и комментарии вы добавили на свой вопрос, сбор данных Subscribers время сохранения должным образом (вы проверили это с помощью meteor mongo), но вы не можете получить данные с помощью Subscribers.find(). Поскольку вы удалили пакет autopublish, вам необходимо убедиться, что подписались на публикацию, которая отвечает за то, что вы нажимаете на ваш сервер Subscribers с сервера. Например:

/server/publications.js

Meteor.publish('allSubscribers', function() { 
    return Subscribers.find(); 
}); 

/client/some_template.js

Template.someTemplate.onCreated(function() { 
    this.subscribe('allSubscribers'); 
}); 
... 

После того, как вы подписались на ваши данные, вы можете запустить Subscribers.find(), и данные возвращены.

Для получения дополнительной информации см. Раздел «Руководство по метеоризму» Publications and Data Loading.

+0

Спасибо за ваш ответ, очень ценится. Мне удалось разобраться с листингом, и он работает нормально. Я просто добавляю подтверждение перед вставкой в ​​соответствии с предложением MasterAM. Что-нибудь еще я должен рассмотреть для публичной формы, как это? Я хочу сделать его максимально безопасным для этого сценария. – Adrian

Смежные вопросы