在Node中使用fast-csv返回数组

时间:2018-12-13 14:39:02

标签: javascript node.js

我正在尝试使用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()返回值,但是我不知道正确的方法。

1 个答案:

答案 0 :(得分:2)

您是正确的,.on('end'中的回调返回值是问题的根源。

流是异步的。如果您想使用此fast-csv库,则需要从getCountries()返回承诺。但是,我假设这不是您想要的,因为您正在配置文件中使用结果,该文件是同步的。

要么需要同步读取csv,要么需要重构应用程序的工作方式以使配置异步。我假设第二种选择是不可能的。

您可能想研究使用另一个不使用流并且是同步的CSV库。快速Google搜索中的两个示例是:

我个人都没有使用过这两个库,但是它们似乎支持您的尝试。我假设您的CSV文件足够小,可以一次全部存储在内存中,否则,您将不得不探索更复杂的选项。


请注意,是否有任何特定原因导致数据必须为CSV格式?以JSON格式存储它似乎要容易得多。 JSON可以直接通过require导入到您的配置文件中;无需外部库。