2016-08-04 72 views
0

使用流星我试图使用表单捕获并保存一些数据(姓名,电子邮件和年龄)。这些数据应该保存在一个新的流星收藏“订户”中。我的代码如下:使用流星方法将表单数据保存到集合

模板活动(客户端\意见\ 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消息正确拾取数据,但每当我尝试查询它获得的集合时一点都不显示。

我试图寻找集合中的数据,使用我创建的一个简单模板来列出Subscribers集合在表中,也与流星玩具和console.log(Subscribers.find());但没有运气。似乎表格经历了,但数据并未保存在收藏中。

enter image description here

此外,自动发布不安全被除去。

enter image description here

我在做什么错?我对Meteor的一切还是很陌生的,所以这可能是我在这里失踪的事情。

让我知道你是否需要看到更多的代码。最后,欢迎任何关于代码改进(结构化或其他)的建议。

非常感谢提前!

+0

一些快速注释:1.不要简单地“允许”直接插入集合。对于服务器上的方法不是必需的,并且允许任何用户将任意数据插入到集合中。 2.您通常不能访问客户端的所有数据库。这是pub/sub的用途。如果你想知道服务器上存储了什么数据,直接查询数据库(使用'meteor shell','meteor mongo'或任何允许你直接访问数据库的gui/cli工具)。 3.验证服务器上的用户输入。 – MasterAM

+0

你是对的。我只是使用'meteor mongo'来查询数据,一切都在那里。所以它在列表位上肯定是错的。我会研究它。谢谢你的提示。此外,你说不要直接插入收藏。对我而言,最好的方法是什么?该表格基本上是一个简讯,所以表格是公开的,每个人都可以提交他们的信息。现在在后端,我只是想列出'订阅者'。你会为这种情况推荐什么?我真的很感激一个例子。另外,如果你能详细说明(2)请。 – Adrian

+0

(2)查看出版物和订阅。阅读[流星指南](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