Преобразование json в csv с использованием пакета json2csv асинхронно с использованием parseAsync выдает ошибку

#node.js #json2csv

#node.js #json2csv

Вопрос:

Я использую json2csv для преобразования ответа json в csv. Мне нужно использовать это как асинхронное. Чтобы он не блокировал другие вызовы api. Приведенный ниже код, который я пробовал, но он выдает ошибку. «Ошибка типа: parseAsync не является функцией»

 const parseAsync = require("json2csv")       
    mycollection.aggregate(aggquery, function (err, jsondata) {    
       parseAsync(jsondata, opts).then(csv => console.log(csv))
         .catch(err => console.error(err));    
    });
  

После преобразования csv мне нужно записать это в файл.

Ответ №1:

Согласно документам json2csv, parseAsync() это не экспорт по умолчанию, а свойство экспорта. Другими словами, вместо этого:

 const parseAsync = require("json2csv")
  

… вы хотите это:

 const { parseAsync } = require("json2csv")
  

Это позволит вам избежать ошибки, которую вы видите, о parseAsync() том, что она не является функцией.

Ответ №2:

Вы должны иметь возможность использовать parseAsync, а затем записать полученные данные CSV в файл с помощью fs.WriteFile .

 const { parseAsync } = require("json2csv")
const fs = require("fs");
const filePath = "./csvdata.csv"; // Enter file path here...

mycollection.aggregate(aggquery, async function(err, jsondata) {
    if (err) {
        console.error("mycollection.aggregate: An error occurred:", err);
        return;
    }
    try { 
        const csv = await parseAsync(jsondata, {});
        fs.writeFile(filePath, csv, { encoding: "utf-8" }, (fileErr) => { 
            if (fileErr) {
                console.error("mycollection.aggregate: Error writing CSV to file:", fileErr);
            }
        })
    } catch (err) {
        console.error("mycollection.aggregate: parseAsync: An error occurred:", err);
    }
});
  

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

1. Поскольку это асинхронное ожидание. Это заблокирует мои другие вызовы api.

2. Это не заблокирует вызовы, агрегатная функция не будет ждать завершения обратного вызова. Вы могли бы провести некоторое тестирование, чтобы убедиться, что это так, но я могу обещать вам, что это не заблокирует вызовы.