我正在尝试使用fast-csv库解析大文件,并将其值作为数组返回到config.js文件。请帮忙,因为配置的model.exports部分中的 countries 的值最终是 undefined 。
解析器:
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;
});
}
配置:
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()返回值,但是我不知道正确的方法。
答案 0 :(得分:2)
您是正确的,.on('end'
中的回调返回值是问题的根源。
流是异步的。如果您想使用此fast-csv
库,则需要从getCountries()
返回承诺。但是,我假设这不是您想要的,因为您正在配置文件中使用结果,该文件是同步的。
要么需要同步读取csv,要么需要重构应用程序的工作方式以使配置异步。我假设第二种选择是不可能的。
您可能想研究使用另一个不使用流并且是同步的CSV库。快速Google搜索中的两个示例是:
我个人都没有使用过这两个库,但是它们似乎支持您的尝试。我假设您的CSV文件足够小,可以一次全部存储在内存中,否则,您将不得不探索更复杂的选项。
请注意,是否有任何特定原因导致数据必须为CSV格式?以JSON格式存储它似乎要容易得多。 JSON可以直接通过require
导入到您的配置文件中;无需外部库。