我有一份依赖流星电子邮件包的时事通讯。
管理员提交新的新闻&所有订阅者通过电子邮件收到此事件条目。这也有效。
但是,我想添加新闻的新具体链接&事件进入页面。
新闻和活动页面的路线:
// Specific news and events
Router.route('/news-and-events/:_id', {
name: 'newsAndEventsPage',
waitOn: function(){
return [
Meteor.subscribe('newsevents'),
Meteor.subscribe('images'),
Meteor.subscribe('categories'),
Meteor.subscribe('tags'),
]
},
data: function(){
return NewsEvents.findOne({_id: this.params._id});
},
});
用于添加新条目的管理员路线(表单页面):
// Admin news
Router.route('/admin-news-events', {
name: 'adminNewsEvents',
waitOn: function(){
return [
Meteor.subscribe('newsevents'),
Meteor.subscribe('images'),
]
},
data: function(){
return false
},
});
在将帖子提交到集合后,我尝试捕获条目并传递id,但我只是未定义。
我的管理员template.js(已编辑):
'submit form': function (evt, template) {
evt.preventDefault();
var temp = {};
temp.title = $('#title').val();
temp.description = $('#description').summernote('code');
temp.type = $('input[name=netype]:checked').val();
temp.createdAt = moment().format('ddd, DD MMM YYYY hh:mm:ss ZZ');
Meteor.call('NewsEvents.insert', temp);
Bert.alert("New entry added.");
//Fire the email to all Subscribers
var entry = NewsEvents.findOne(this._id);
var entryId = entry.id;
//NOT WORKING
var news = '<a href='+Meteor.absoluteUrl()+'news-and-events/'+entryId+'></a>';
for (i = 0; i < Subscribers.find().count(); i++) {
var email_ = Subscribers.find().fetch()[i].email;
Meteor.call('sendEmail',
email_, //To
'Open Strategy Network <xxx.yyy@zzz.yyy.xx>', //from
'Open Strategy Network News and Events', //subject
news);
}
}
服务器方法:
Meteor.methods({
'NewsEvents.insert': function (doc) {
if (this.userId) {
NewsEvents.insert(doc);
}
}
});
...
//Send emails
'sendEmail': function (to, from, subject, text) {
// check([to, from, subject, text], [String]);
this.unblock();
Email.send({
to: to,
from: from,
subject: subject,
html: text
});
},
非常感谢。
答案 0 :(得分:1)
.find()
返回一个游标,而不是一个对象。你可以这样做:
var entry = NewsEvents.findOne(this._id);
var entryId = entry.id;
或者更简单,因为您已经拥有_id
:
var entryId = this._id;
甚至更简单:
var news = '<a style:"text-decoration: none;"
href='Meteor.absoluteUrl()+'news-and-events/'+this._id+'></a>';
此外,您尝试在插入异步发生时发送电子邮件。
Meteor.call('NewsEvents.insert', temp); // this might take some time to complete
var entry = NewsEvents.findOne(this._id); // `this` is not going to refer to the just added NewsEvent
相反,请从方法回调中执行通知:
Meteor.call('NewsEvents.insert', temp, function(err, result){
if ( !err ){
// assuming that `result` will be the _id of the inserted object!!
var news = '<a href='+Meteor.absoluteUrl()+'news-and-events/'+result+'></a>';
Subscribers.find().forEach(function(s){
Meteor.call('sendEmail',
s.email, //To
'Open Strategy Network <violetta.splitter@business.uzh.ch>', //from
'Open Strategy Network News and Events', //subject
news
);
}
}
});
您的NewsEvents.insert
方法需要返回插入对象的_id
:
Meteor.methods({
'NewsEvents.insert'(doc) {
if (this.userId) return NewsEvents.insert(doc);
}
});
现在,由于你在循环中进行Meteor.call()
,所以即使上述情况也会很慢。其次,您已将服务器打开为邮件中继,因为任何人都可以使用sendEmail
方法从应用程序内的控制台向任何人发送任何电子邮件。如果您想有效地执行此操作,请将通知代码放在NewsEvents.insert
方法中,并在服务器上完成所有操作,而不必来回!!
答案 1 :(得分:1)
如果我理解正确,您希望拥有插入文档的ID。它相当简单。
在插入的方法中:
ViewGroup
现在,您可以使用相同的方法将docId用于发送电子邮件。
如果您还想将documentId发送到客户端,则可以使用错误,结果为var docId = Somethings.insert({ //fields here });
,如下所示:
Meteor.call()
上述错误来自您在方法中引发的错误。对于结果,您需要返回一个值,该值可以是插入的docId:
Meteor.call('methodName', arg, arg2, function(err, res){
if(!err){
//do something with res. in this case the res is inserted docId as I returned docId in the method
Router.go('/some-route/' + docId)
} else {
//do something with err
}
});
整理方法:
return docId
PS:如果这不能回答你的问题,那就意味着我不明白你想要达到的目标。给我留言,我会编辑答案。
修改强>
我使用了一种方法来发送电子邮件和插入文档但是,你仍然可以像我一样传递错误/结果,然后使用结果中的id再次调用电子邮件。