Поток файлов NodeJS и CSVtoJSON

#node.js #file #stream #pipe #csvtojson

#node.js #файл #поток #канал #csvtojson

Вопрос:

Ожидаемая функциональность кода:

  1. получение файла CSV
  2. запишите его во временный каталог
  3. преобразуйте этот файл в JSON с помощью библиотеки csvtojson
  4. добавить префикс data = к файлу
  5. создайте JS-файл в результате и запишите его в другой каталог

Процесс отлично работает с короткими файлами CSV. Когда отправляются файлы большего размера (файлы CSV, содержащие более 20 000 строк), результирующие данные сокращаются примерно до 1800-2500 строк. Когда я запускаю приложение локально и загружаю файл в первый раз, даже при загрузке больших файлов все работает нормально. Все также в порядке, если я что-либо изменю в части кода ReadStream, и сервер перезапустится, поэтому я предполагаю, что поток чтения нужно как-то сбросить. Я использовал эту документацию для реализации этой части.

РЕДАКТИРОВАТЬ 03-09-2020: После развертывания на сервере приложение может обрабатывать даже большие файлы CSV

 router.post("/", upload.single("productData"), (req, res, next) => {
  const product = new Product({
    _id: new mongoose.Types.ObjectId(),
    productData: req.file.path,
  });
  product
    .save()
    .then(() => {
      let nameOfNewDirectory = req.body.dirName;
      let dir = `./someDirectory/${nameOfNewDirectory}`;

      if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir);
      }

      const readStream = fs.createReadStream(req.file.path);
      const writeStream = fs.createWriteStream(`./${dir}/data.js`, {
        flags: "w",
      });

      writeStream.write("data = ", () => {
        console.log("prefix to a data.js is written");
      });

      readStream
        .pipe(
          CSVToJSON({
            maxRowLength: 65535,
            checkColumn: true,
            downstreamFormat: "array",
            ignoreEmpty: false,
            delimiter: "auto",
          })
        )
        .pipe(writeStream);
    })
});
  

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

1. Я попытался воспроизвести вашу проблему. Я не получил тот же результат. Я создал простой экспресс-сервер, на котором я пытался конвертировать много больших файлов CSV друг за другом. Поэтому я думаю, что проблема в части Мангуста. Вы сохраняете только идентификатор и путь к MongoDB?

2. Точно, на данный момент в базе данных сохраняются только идентификаторы и пути. Я только что удалил весь код, связанный с записью в DB, и результаты те же. Мне кажется, что какой-то другой процесс прерывает поток записи, сначала я подумал о буферизации, но конвейер должен справиться с этим.

3. Хорошо, я думаю, вы правы. Я подумаю об этом дальше.