#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
вызове вы можете рассчитать разницу во времени между «сейчас» и сохраненной меткой времени. Если разница больше, чем ваше ожидаемое время восстановления — отправьте письмо и обновите отметку времени или отклоните отправку иным способом.