Несколько setTimeouts в дальнейшем не придерживаются графика

У меня есть сервер базы данных электронной почты в NodeJS, который отправляет запланированные электронные письма в указанные ниже сроки.

Email 1: Immediately
Email 2: 3 days after email 1
Email 3: 7 days after email 1

Тем не менее, при отправке нескольких записей в приложение, оно сбрасывает планирование, случайным образом шагая по setTimeouts.

Вот соответствующий код, который планирует электронные письма

server.post('/api/addUser', (req, res) => {

  MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("heroku_XXXXXXXX");
    var myobj = { recruiter: req.body.recruiter, firstName: req.body.firstName, lastName: req.body.lastName, profile: req.body.profile, email: req.body.email, emailStep: 'Step 1', emailsCancelled: 'No', source: req.body.source, company: req.body.company, role: req.body.role };
    dbo.collection("users").insertOne(myobj, function(err, data) {
      if (err) throw err;
      res.status(200).send('success');
      db.close();
      sendMail(myobj,req.body.emailOne, "Step 1");
      var sched = later.parse.recur().every(72).hour(),
        t = later.setTimeout(function() { sendMail(myobj,req.body.emailTwo, "Step 2"); }, sched);
      var sched2 = later.parse.recur().every(168).hour(),
          u = later.setTimeout(function() { sendMail(myobj,req.body.emailThree, "Step 3"); }, sched2);
    });
  });
});

Электронные письма работают хорошо, и они передаются в SendGrid, все в порядке, это просто расписание. Я пытался удалить LaterJS и просто использовать setTimeouts, но это тоже не сработало.

1 ответ

Я бы не стал полагаться на setTimeout для таких длительных периодов. Я не уверен в деталях реализации setTimeout в node/v8, но что бы они ни делали, часы компьютера будут сдвигаться, виртуальная машина также будет приостанавливаться / возобновляться.

Вместо этого определите список задач, запускайте меньшую функцию, проверяющую время каждые несколько минут и запускающуюся, если есть какая-либо задача. Вы также можете использовать crontab и т. Д. Для вызова приложения для отправки электронных писем. Таким образом, вы также можете быть уверены, что перезапуск этой службы будет в порядке.

Кроме того, я рекомендую немного почистить ваш код. Переместите вещи вне каждого вызова функции, определив некоторые переменные, может быть?

Другие вопросы по тегам