首页 > 解决方案 > 在 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()返回一个值,但是我不知道正确的方法。

标签: javascriptnode.js

解决方案


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

流是异步的。如果你想使用这个fast-csv库,你需要从getCountries(). 但是,我假设这不是您想要的,因为您在配置文件中使用结果,这是同步的。

您需要同步读取 csv,或者您需要重构应用程序的工作方式以使您的配置能够异步。我假设第二个选项是不可能的。

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

我个人没有使用过这些库中的任何一个,但看起来它们会支持您尝试做的事情。我假设您的 CSV 文件足够小,可以一次全部存储在内存中,如果不是,您将不得不探索更复杂的选项。


作为旁注,数据必须采用 CSV 格式是否有任何具体原因?以 JSON 格式存储它似乎要容易得多。JSON 可以直接使用require;导入到您的配置文件中。不需要外部库。


推荐阅读