0

これは、私のアプリで対処する最も難しい問題の 1 つだと思います。moment.js をインストールしました (mrt を使用)。私がやりたいことは、サーバーがそのユーザーの友人に電子メールを送信する日時をユーザーに選択させることです。たとえば、現在は木曜日の午後 9 時 13 分で、ユーザーは月曜日の午前 6 時 47 分にメッセージを送信したいと考えています。ユーザーが時間を設定した後、毎週、ユーザーが設定した日時に電子メールを繰り返し送信したいと考えています。だから私はそのようなmoment.jsを使用すると考えました(クライアント側):

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

次に、ユーザーがそのように選択した時刻と日付を設定するために、jqueryui または一般的なものなどの日付ピッカーとタイムピッカーを使用します (クライアント側)。

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:"myApplication@xxx.com"
Subject:"auto email send"
html:"auto email send"
});
}

私が知らないことの1つは、ユーザーが長い間アプリに入っていない場合(たとえば1か月)、それが機能するかどうか、またはMeteor.setIntervalを使用してこの関数を繰り返し実行する必要があるかどうかです?

4

1 に答える 1

3

アプリで非常によく似た処理を行います。

  1. Emails保留中の電子メールを日付付きのコレクションに挿入しemailAtます。
  2. サーバーで使用setIntervalして、送信する電子メールを定期的にポーリングします。

ポーリング コードは次のようになります。

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

幸いなことに、Dateオブジェクトは UTC で記述されているため、オブジェクトに対して行う計算は、ユーザーまたはサーバーのいずれかのタイムゾーンから独立している必要があります。さらに、次のよう$lteにコレクションから取得するときに使用できます。Emails

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

サーバーがリセット/ハングアップする可能性があることを覚えておくことが重要です。emailAtそのため、ポーリング間隔を十分に小さく設定して、これを補正し、DB に過度の負荷をかけずに時間に近づけることができます。

ところで、瞬間オブジェクトの操作または比較で問題が発生した場合はtoDate()、DB と対話する前にそれらを呼び出すことができます。

于 2013-10-17T18:34:23.037 に答える