Возвращаем массив с fast-csv в Node

1

Я пытаюсь проанализировать большой файл с помощью библиотеки fast-csv и вернуть его значения в виде массива в файл config.js. Пожалуйста, помогите, так как значение стран в разделе config model.exports окажется неопределенным.

Parser:

import csv from 'fast-csv';

export function getCountries() {
let countries = [];
 csv.fromPath('./src/config/csv_configs/_country.csv')
    .on('data',
        function(data) {
            countries.push(data);
        })
    .on('end', function () {
         return countries;
     });
}

Config:

import {getCountries} from '../tools/csv_parser';

let countryList = [];

module.exports = {
  port: process.env.PORT || 8000,
  token: '',
  countries: getCountryList()
};

function getCountryList() {
  if (countryList.length === 0) {
    countryList = getCountries();
  }
  return countryList;
}

Я понимаю, что это из-за того, что я пытаюсь вернуть значение из анонимной функции on(), однако я не знаю правильного подхода.

Теги:

1 ответ

0

Вы правы, что возвращение значений из обратного вызова в .on('end' является источником вашей проблемы.

Потоки асинхронные. Если вы хотите использовать эту библиотеку fast-csv, вам нужно будет вернуть обещание из getCountries(). Тем не менее, я предполагаю, что это не то, что вы хотите, так как вы используете результат в файле конфигурации, который является синхронным.

Либо вам нужно читать ваш CSV синхронно, либо вам нужно реорганизовать способ работы вашего приложения, чтобы ваша конфигурация была асинхронной. Я предполагаю, что второй вариант невозможен.

Возможно, вы захотите использовать другую библиотеку CSV, которая не использует потоки и работает синхронно. Два примера из быстрого поиска Google:

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


Как примечание, есть ли конкретная причина, по которой данные должны быть в формате CSV? Казалось бы, гораздо проще хранить его в формате JSON. JSON может быть импортирован в ваш конфигурационный файл напрямую с помощью require; внешние библиотеки не нужны.

  • 1
    Спасибо. Я использовал вторую синхронную библиотеку, которую вы предложили. Файлы csv предоставлены API, с которым я интегрируюсь, и относительно длинны. Возможность разбирать их напрямую предпочтительнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню