Как правильно добавлять объекты в 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, где нет проблем с записью многих строк за раз?


Ответы (0 шт):