Есть ли функция восстановления для nodejs/nodemailer, чтобы она перестала вызываться после отправки 1 электронного письма

#javascript #mysql #node.js #express #nodemailer

Вопрос:

На моем подключенном устройстве у меня есть немного кода, который отправляет предупреждение на сервер через BananaPi, когда батарея разряжена

 if ([batt_level] lt; batt_min){ this.emit('Battery Alert', msg) }  

Затем оповещение отправляется на сервер, и если оно успешно зарегистрируется в базе данных, оно будет отправлено почтовому отправителю, чтобы пользователь мог получить уведомление о необходимости зарядки своих устройств:

battery.js:

 connection.query(stmt, [body.tag], err =gt; {  if (err) {  res.status(400).send("battery can't be registered")  } else {  try {  mailer.sendMail(body)  res.status(200).send("battery was registered")  } catch (error) {  res.status(400).send("an error occured")  }  }  })  

mailer.js:

 async sendMail(message) {  try {  await this.transporter.sendMail(  {  from: process.env.MAIL_FROM,  to: process.env.MAIL_TO,  subject: `Alert on device ${message.tag}`,  text: `foo`,  html: ` lt;/pgt;`  }, (err, info) =gt; {  if (err) {  console.log(err);  }  console.log("response =gt; %s", info);  })  } catch (error) {  console.log(error);  }  }  

Теперь, когда уровень заряда батареи опускается ниже 10%, он отправит 1 оповещение по электронной почте, и это нормально, но каждый раз, когда данные отправляются на сервер (5 запросов в минуту), а уровень заряда батареи составляет от 10% до 0%, он будет отправлять новое электронное письмо, пока уровень заряда батареи не превысит 10%, и это моя проблема.

Есть ли какое-то восстановление javascript, которое я мог бы реализовать, чтобы отправить электронное письмо/предупреждение только один раз, и где его лучше всего реализовать (на устройстве, сервере, почтовом узле?)? Я в основном хочу, чтобы функция sendMail перестала работать на несколько часов, как только будет отправлено одно электронное письмо.

Но я не могу реализовать общее восстановление функции sendMail, потому что есть 6 разных устройств, которые проходят через один и тот же почтовый ящик, поэтому каждое восстановление должно быть специфичным для данного устройства.

(Я не хочу иметь условие, которое отправляет предупреждение только в том случае, если батарея === 10% или если батарея lt; 10% amp;amp; батарея gt; 9%, например, в случае, если уровень заряда падает с 11% до 8%).

Заранее спасибо

Комментарии:

1. Сохраните отметку времени, когда вы отправляли почту в последний раз ( sendMail звонили). При следующем sendMail вызове вы можете рассчитать разницу во времени между «сейчас» и сохраненной меткой времени. Если разница больше, чем ваше ожидаемое время восстановления — отправьте письмо и обновите отметку времени или отклоните отправку иным способом.