Javascript Meteor异步的基本概念:提交电子邮件和发送电子邮件

Javascript Meteor异步的基本概念:提交电子邮件和发送电子邮件,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我对Meteor框架真的很陌生,很难理解它的概念,来自Meteor的传统响应和请求背景(以NodeJS异步回调风格) 我只是想建立一个登录页,告诉我你的名字和电子邮件地址。在用户单击submit之后,我希望将用户保存在数据库(MongoDB)中,并向Mandrill端点发送请求,以便Mandrill可以向该特定电子邮件地址发送电子邮件 我在传统的回应和请求中的做法是这样的。用户提交他们的姓名和电子邮件地址,这将是对我的服务器的POST请求,在我的服务器上,我的ORM会将其保存到数据库中,在回调成

我对Meteor框架真的很陌生,很难理解它的概念,来自Meteor的传统响应和请求背景(以NodeJS异步回调风格)

我只是想建立一个登录页,告诉我你的名字和电子邮件地址。在用户单击submit之后,我希望将用户保存在数据库(MongoDB)中,并向Mandrill端点发送请求,以便Mandrill可以向该特定电子邮件地址发送电子邮件

我在传统的回应和请求中的做法是这样的。用户提交他们的姓名和电子邮件地址,这将是对我的服务器的POST请求,在我的服务器上,我的ORM会将其保存到数据库中,在回调成功后,我向Mandrill发出请求,向该特定用户发送电子邮件

我现在在Meteor中的代码如下:

Template.welcome.events({
  'submit form': function(e) {
    e.preventDefault();

    var subscribe = {
      name: $(e.target).find('[name="name"]').val(),
      email: $(e.target).find('[name="email"]').val()
    };

    var errors = validateSubscribes(subscribe);
    if (Object.keys(errors).length > 0) {
      for (var type in errors) {
        toast(errors[type], 2000);
      }
      return;
    }

    Subscribes.insert(subscribe, function(error, result) {
      if (error)
        return toast("Oops, something is wrong, try again");

      if (result) {
        $(e.target).find('button:submit')
                   .attr("disabled", "disabled");
        $(e.target).find('[name="name"]')
                   .val("")
                   .attr("disabled", "disabled");
        $(e.target).find('[name="email"]')
                   .val("")
                   .attr("disabled", "disabled");

        return toast('Thank you for subscribing!', 3000);
      }
    });
  }
});
我的Mandrill代码如下(来自)

此外,在集合中,我还允许订阅

Subscribes = new Mongo.Collection('subscribes');

Subscribes.allow({
  insert: function(userId, subscribe) { return true; }
});

validateSubscribes = function(subscribe) {
  var errors = {},
      regExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

   if (!subscribe.name)
    errors.name = 'Please fill in a name';

  if (!subscribe.email || !regExp.test(subscribe.email))
    errors.email = 'Please fill in a valid email';

  return errors;
};
Subscribes=newmongo.Collection('Subscribes');
允许订阅({
insert:function(userId,subscribe){return true;}
});
validateSubscribes=函数(订阅){
var errors={},
regExp=/^([^()[\]\\,;:\s@\“]+(\.[^()[\]\,;:\s@\“]+)*)(\“+\”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{0-9]{1,3}.[1,3}.[0-9]{1,3}.]124;([a-zA Z-0-9]+-zA 0-9]+];
如果(!subscribe.name)
errors.name='请填写一个名称';
如果(!subscribe.email | |!regExp.test(subscribe.email))
errors.email='请填写有效的电子邮件';
返回错误;
};
我有三个问题:

  • 为什么使用allow?为什么不使用Meteor.method和Meteor.call
  • 我应该把mandrill代码放在哪里?在回调中?我认为Meteor风格的编程应该是同步风格的
  • 我可以将我的所有验证逻辑放在这里,将我的所有jQuery UI逻辑放在这个提交表单事件中。我可以看到它很快就会膨胀。是否有任何具体的方式来组织所有这些
非常感谢你的回答。流星是超级酷,只需要把我的头围绕它一点点

基督教徒

  • 我们中的许多人专门使用Meteor.Method。查看探索流星博客,了解一个好的起点。 在我的例子中,我插入的几乎每个文档都附带了一个日期戳&userId,因此我必须使用方法,否则用户可以在客户机上声明任意Id。即使没有必要,这只是一种更简单的思维方式,而不是在你的头脑中运行允许/拒绝逻辑(记住,1为真,你就完蛋了)。这就是为什么有些人建议只使用deny,或者安装另一个包

  • 服务器上的Meteor使用光纤,这使得代码看起来是同步的。 我将通过将您的
    插入
    移动到
    Meteor.method
    来组织此操作。然后,我将使用从客户机收集并在服务器上验证的文档调用mandrill。(IIRC Mandrill需要一个APIkey,所以无论如何,您可能不希望在客户端代码中挂起它)

  • 查看collection2和简单模式。它避免了大量混乱的服务器端检查、挑选和清理。学习曲线有点高&还有其他可靠的软件包,但这不是官方的meteor事实标准


  • 嗨,马特,谢谢你的回复。你能给我一个2号的代码示例吗?你具体想要什么?该包的github页面有一个很好的例子,其中包含
    this.sendmail()
    函数。在客户端,我会调用Meteor.call(“sendMyMail”,options),在服务器上,
    sendMyMail
    将是一个函数,它接收选项、验证并返回对Meteor.Mandrill.send()的调用。,如果没有任何验证,您也可以直接调用.send()。如果没有回调,
    Meteor.call
    将同步运行,但不会向客户端发出返回值。
    Subscribes = new Mongo.Collection('subscribes');
    
    Subscribes.allow({
      insert: function(userId, subscribe) { return true; }
    });
    
    validateSubscribes = function(subscribe) {
      var errors = {},
          regExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    
       if (!subscribe.name)
        errors.name = 'Please fill in a name';
    
      if (!subscribe.email || !regExp.test(subscribe.email))
        errors.email = 'Please fill in a valid email';
    
      return errors;
    };