Я пытаюсь проанализировать большой файл с помощью библиотеки 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(), однако я не знаю правильного подхода.
Вы правы, что возвращение значений из обратного вызова в .on('end'
является источником вашей проблемы.
Потоки асинхронные. Если вы хотите использовать эту библиотеку fast-csv
, вам нужно будет вернуть обещание из getCountries()
. Тем не менее, я предполагаю, что это не то, что вы хотите, так как вы используете результат в файле конфигурации, который является синхронным.
Либо вам нужно читать ваш CSV синхронно, либо вам нужно реорганизовать способ работы вашего приложения, чтобы ваша конфигурация была асинхронной. Я предполагаю, что второй вариант невозможен.
Возможно, вы захотите использовать другую библиотеку CSV, которая не использует потоки и работает синхронно. Два примера из быстрого поиска Google:
Я не использовал ни одну из этих библиотек лично, но похоже, что они поддерживают то, что вы пытаетесь сделать. Я предполагаю, что ваш CSV файл достаточно мал, чтобы все можно было сохранить в памяти одновременно, если нет, вам придется изучить более сложные варианты.
Как примечание, есть ли конкретная причина, по которой данные должны быть в формате CSV? Казалось бы, гораздо проще хранить его в формате JSON. JSON может быть импортирован в ваш конфигурационный файл напрямую с помощью require
; внешние библиотеки не нужны.