2013-10-17 42 views
0

我認爲這是我在我的應用程序中處理的最難的問題之一, 我已經安裝了moment.js(使用mrt)。 和我想要做的是讓用戶選擇一個日期和時間,服務器將發送電子郵件給該用戶的朋友。例如:現在是星期四晚上9點13分,用戶想要在星期一上午6點47分發送消息。 並且在用戶設置了我希望在用戶設置的日期和時間每週重複發送電子郵件的時間之後。 所以我想使用這樣的(客戶端)moment.js:流星按日期和時間發送電子郵件

var now = moment(); (the current date and time). 

然後使用一個datepicker像jQueryUI的或共同的一個,和一個timepicker,用於設置用戶選擇這樣的時間和日期(客戶端):

var day = user selection using datepicker; 
var time = user selection using timepicker; 
var result = moment.set(day,time); 

結果插入到數據庫:

DateToSendEmail.insert({date:result}); 

終於有代碼真正執行Email.send功能(服務器端):

var DateToSend = DateToSendEmail.findOne({}); 
var thisMoment = moment(); 
if(DateToSend === thisMoment){ 
Email.send({ 
to:[friends] 
from:"[email protected]" 
Subject:"auto email send" 
html:"auto email send" 
}); 
} 

的一兩件事,我不知道是如果用戶的心不是隨着時間進入應用它是否會工作(可以說一個月)或我應該使用Meteor.setInterval反覆執行該功能?

回答

3

我們做我們的應用程序非常類似:

  1. 插入掛起的電子郵件爲Emails收集與emailAt日期。
  2. 在服務器上使用setInterval來定期輪詢發送的電子郵件。

您的投票代碼可能看起來像:

Meteor.startup(function() { 
    if (process.env.METEOR_ENV === 'production') { 
    Meteor.setInterval(sendPendingEmails, ONE_HOUR); 
    } 
}); 

幸運的是,Date對象都寫在UTC,所以你對他們做任何的數學應該是獨立的或者您的用戶或服務器的時區。此外,還可以從Emails集合取像,所以當使用$lte

var sendPendingEmails = function() { 
    var currentDate = new Date(); 
    var pendingEmails = Emails.find({emailAt: {$lte: currentDate}}).fetch(); 
    ... 
}; 

重要的是要記住,你的服務器可能會被重置/掛機/等是很重要的。所以你需要設置一個足夠小的輪詢時間間隔來彌補這一點,並且接近emailAt時間,而不會對數據庫施加太多的負載。

順便說一句,如果你遇到任何問題操縱或比較時間對象,你可能想要在他們與數據庫交互之前打電話toDate()

+0

謝謝,生病檢查一下,並嘗試與它一起玩,生病一定要告訴你,如果我管理這個問題,以及how.thank你agian大衛韋爾登 –

+0

嘿大衛我想知道爲什麼你選擇preform $美元?考慮到你需要發送數百封電子郵件,爲什麼不能僅僅獲取那些今天匹配的郵件呢:var d = new Date(); var d = d.getDay(); //需要是一個數字(0,1,2 ...) var pendingEmails = Groups.find({emailAt:d})。fetch();該操作將減少數據庫上的負載。 –

+0

在我們的例子中,我們會在郵件發送後從郵件集合中移除項目,所以'$ lte'將會總是返回我們想要的集合。在你的實現中,如果你需要保留電子郵件,那麼你應該按照你的建議向查詢添加一個過濾器。 –

相關問題