Javascript Meteor异步的基本概念:提交电子邮件和发送电子邮件
我对Meteor框架真的很陌生,很难理解它的概念,来自Meteor的传统响应和请求背景(以NodeJS异步回调风格) 我只是想建立一个登录页,告诉我你的名字和电子邮件地址。在用户单击submit之后,我希望将用户保存在数据库(MongoDB)中,并向Mandrill端点发送请求,以便Mandrill可以向该特定电子邮件地址发送电子邮件 我在传统的回应和请求中的做法是这样的。用户提交他们的姓名和电子邮件地址,这将是对我的服务器的POST请求,在我的服务器上,我的ORM会将其保存到数据库中,在回调成功后,我向Mandrill发出请求,向该特定用户发送电子邮件 我现在在Meteor中的代码如下:Javascript Meteor异步的基本概念:提交电子邮件和发送电子邮件,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我对Meteor框架真的很陌生,很难理解它的概念,来自Meteor的传统响应和请求背景(以NodeJS异步回调风格) 我只是想建立一个登录页,告诉我你的名字和电子邮件地址。在用户单击submit之后,我希望将用户保存在数据库(MongoDB)中,并向Mandrill端点发送请求,以便Mandrill可以向该特定电子邮件地址发送电子邮件 我在传统的回应和请求中的做法是这样的。用户提交他们的姓名和电子邮件地址,这将是对我的服务器的POST请求,在我的服务器上,我的ORM会将其保存到数据库中,在回调成
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
来组织此操作。然后,我将使用从客户机收集并在服务器上验证的文档调用mandrill。(IIRC Mandrill需要一个APIkey,所以无论如何,您可能不希望在客户端代码中挂起它)嗨,马特,谢谢你的回复。你能给我一个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;
};