Meteor:通过电子邮件发送文档ID

时间:2016-07-08 12:29:42

标签: javascript mongodb meteor

我有一份依赖流星电子邮件包的时事通讯。

管理员提交新的新闻&所有订阅者通过电子邮件收到此事件条目。这也有效。

但是,我想添加新闻的新具体链接&事件进入页面。

新闻和活动页面的路线:

// 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
      });
    },

非常感谢。

2 个答案:

答案 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再次调用电子邮件。