javascript - 在 Node 中返回带有 fast-csv 的数组
问题描述
我正在尝试使用 fast-csv 库解析一个大文件,并将其值作为数组返回到 config.js 文件。请帮忙,因为配置的 model.exports 部分中国家的值最终是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()返回一个值,但是我不知道正确的方法。
解决方案
您是正确的,从回调中返回值.on('end'
是您问题的根源。
流是异步的。如果你想使用这个fast-csv
库,你需要从getCountries()
. 但是,我假设这不是您想要的,因为您在配置文件中使用结果,这是同步的。
您需要同步读取 csv,或者您需要重构应用程序的工作方式以使您的配置能够异步。我假设第二个选项是不可能的。
您可能想考虑使用另一个不使用流并且是同步的 CSV 库。来自 Google 快速搜索的两个示例是:
我个人没有使用过这些库中的任何一个,但看起来它们会支持您尝试做的事情。我假设您的 CSV 文件足够小,可以一次全部存储在内存中,如果不是,您将不得不探索更复杂的选项。
作为旁注,数据必须采用 CSV 格式是否有任何具体原因?以 JSON 格式存储它似乎要容易得多。JSON 可以直接使用require
;导入到您的配置文件中。不需要外部库。