Как правильно добавлять объекты в JSON файл через writeableStream?
Пишу telegram бота, хочу, чтобы при отправке сообщения с sticker_id (по регулярному выражению просто), в мой json файл добавлялись объекты. Сейчас есть такой вариант:
// условная очередь запросов
let stickerAddRQ = [];
// указывает на то, запущен ли таймер на запись файлов
let isResolving = false;
// записывает все строки, помещенные в очередь, затем очищает очередь
const resolveStickerRQ = async () => {
const fs = require("fs");
// читает json
fs.readFile("./contentbase/duck_stickers.json", (err, data) => {
if (err) throw err;
// данные из файла
let res = JSON.parse(data);
// добавляет объекты из очереди в данные из файла
stickerAddRQ.map((i) => res.duckStickers.push(i));
// обратное преобразование в JSON
let json = JSON.stringify(res, null, 2);
// запись данных в файл, очистка очереди
fs.writeFile("./contentbase/duck_stickers.json", json, (err) => {
if (err) throw err;
console.log(`${data} written`);
stickerAddRQ = [];
isResolving = false;
});
});
};
// добавляет строку в очередь
const addStickerToRQ = async (element) => {
try {
if (!stickerAddRQ.includes(element)) {
stickerAddRQ.push(element);
}
console.log(`added item ${element} in addStickerRQ`);
} catch (e) {
console.log(e);
}
};
// при получении сообщения, стикер добавляется в очередь
bot.onText(/\CAAC+/i, async (msg) => {
addStickerToRQ(msg.text);
// если таймер не запущен, запускает его, если нет, то просто добавляет в очередь
if (isResolving === false) {
setTimeout(() => {
resolveStickerRQ();
}, 3000);
isResolving = true;
}
});
К решению с таймером пришел по причине того, что если напрямую во время срабатывания триггера на сообщение делать запись в файл (как в resolveStickerRQ), то в ситуации, когда пересылаются боту сразу много сообщений со стикерами, записывается лишь одна строчка, затем в конце json появляется фигурная скобка, и json становится невалидным.
Данный код работает, но я чувствую, что если использовать readableStream и writeableStream, то не будет надобности в таймерах, и всё должно быть гладко, но так ли это на самом деле?
И, собственно, вопрос: как правильно записывать в этих потоках JSON? И стоит ли вообще их использовать? Или есть какой-то вариант с readFile/writeFile, где нет проблем с записью многих строк за раз?