У меня есть подключение к сокету в моем бэкэнде (express.js) и данные, поступающие из этого сокета каждую секунду, я хочу сохранить эти значения в своей базе данных (postgresql). Поскольку данные поступают каждую секунду, я не хочу сохранять их, когда они приходят, потому что это будет много операций записи. Поэтому я храню их в tempValues
и сохраняю значения в базе данных каждую 1 минуту. Но я чувствую, что должен быть лучший способ сделать это вместо использования setInterval. Может быть, сторонняя библиотека или что-то еще? Я могу потерять временные данные, если сервер вышел из строя или что-то случилось.
Вот мой текущий блок кода:
let tempValues = [];
setInterval(() => {
tempValues.map(async (option, i) => {
await pool.query(
"INSERT INTO plc_options (name, value, date) VALUES ($1, $2, $3)",
[option.name, option.value, option.timestamp]
);
if (i === tempValues.length - 1) tempValues = [];
})
}, 60000);
socket.onAny((eventName, ...args) => {
tempValues.push({ name: eventName, value: args[0], timestamp: new Date() })
});
Я не был уверен, что это правильный способ решения такой проблемы. Теперь убедился, спасибо.
Вам не нужна сторонняя библиотека. Ваша идея в целом нормальная. Это известно как буферизация. Хотя я бы его немного улучшил.
let _tempValues = [];
function getTempValues() {
return _tempValues;
}
function getAndClearTempValues() {
let oldTempValues = _tempValues;
_tempValues = [];
return oldTempValues;
}
setInterval(() => {
let values = getAndClearTempValues();
values.map(async (option, i) => {
await pool.query(
"INSERT INTO plc_options (name, value, date) VALUES ($1, $2, $3)",
[option.name, option.value, option.timestamp]
);
})
}, 60000);
socket.onAny((eventName, ...args) => {
let values = getTempValues();
values.push({ name: eventName, value: args[0], timestamp: new Date() })
});
Основное изменение заключается в том, что я заменяю старый tempValues
пустым массивом перед циклом по массиву. Таким образом, мы избегаем потенциальной ловушки, когда вы асинхронно перебираете массив, в то время как другой код изменяет его. В качестве бонуса вам не нужен оператор if внутри setInterval.
Ваше решение (также известное как буферизация) является стандартным и прекрасным. За исключением того, что вам, вероятно, нужно поменять местами массив с пустым перед обновлением (чтобы избежать гонок). В качестве бонуса вам не понадобится if в конце. Так что именно вы ищете? Зачем менять?