【问题标题】:async csv To JSON data output in nodejs异步csv到nodejs中的JSON数据输出
【发布时间】:2021-10-26 05:59:00
【问题描述】:

我对 nodejs 中的 promise 有一个严重的误解。 我在模块中有一个函数可以将 CSV 转换为 JSON:

const URL_01 = `${__dirname}/URL/some_CSV.csv`;

const fs = require('fs'),
  Converter = require('csvtojson').Converter,
  converter = new Converter({}),

  convertToJson = function(file) {
    return new Promise( (res, rej) => {
      converter.on("end_parsed", (jsonData) => {
        if(!jsonData){
          rej("CSV to JSON conversion failed!")
        }
        res(jsonData);
      });
      fs.createReadStream(file).pipe(converter);
    });
  };

export default convertToJson;

然后我需要在 server.js 中使用 CSVfile_URL 启动函数 convertToJson 并将其保存到 mongo db,现在没有数据输出:

    app.get('/all', async (req, res) => {
  const data = await convertToJson( URL_01 );
  res.send(data);
});

谁能帮帮我?

【问题讨论】:

    标签: javascript node.js mongodb express


    【解决方案1】:

    几个问题:

    1. 您将 ES2015 模块语法与 CommonJS 语法混合使用,这是行不通的。
    2. 根据模块 here 的文档,您似乎没有正确使用 csvjson

    话虽如此,使用this 答案,这样的事情可能会起作用(未经测试):

    const fs = require('fs')
    const csv = require('csvtojson')
    
    const URL_01 = `${__dirname}/URL/some_CSV.csv`;
    
    module.exports = file => new Promise((resolve, reject) => {
      const promises = []
      csv()
        .fromFile(URL_01)
        .on('json', converted => promsies.push(Promise.resolve(converted)))
        .on('done', error => {
          if (error) {
            reject(error)
            return
          }
        Promise.all(promises).then(convertedResults => resolve(convertedResults))
      })
    })
    

    【讨论】:

    • 如果将文件从客户端传递到服务器怎么办?我可以将变量数据放入 fromFile 中吗?
    • 没有。 fromFile 获取磁盘上文件位置的路径。如果您尝试处理来自客户端上传的文件,我认为.fromStream() 会更好。
    【解决方案2】:
    const readStream = fs.createReadStream('yourFile.csv')
    
    await new Promise((resolve, reject) => {
        csv(options)
            .fromStream(readStream)
            .subscribe(json=>{
                return new Promise((resolve, reject)=>{
                    resolve(json)
                })
            })
            .on('header', header => {
                log(`Converting CSV to JSON - headers: ${headers}`)
            })
             .on('data', async data => {
                    // data is a buffer object
                    const jsonStr = data.toString('utf8')
                    log(`Converting CSV to JSON - Current Line: ${jsonStr}`)
                    await fs.appendFile(editDumb, jsonStr)
                })
            .on('done', () => {
                log('Finished converting CSV to JSON')
                resolve()
            })
            .on('error', e => {
                throw new BaseError(`Error while converting CSV to JSON - Error: ${e}`)
            })
    })
    

    【讨论】:

      【解决方案3】:

      您可能想要使用 NPM 提供的现成的 async-csv 包。这将很简单:

      const csv = require('async-csv');
      let parsedObject = await csv.parse(csvFileAsString);
      

      【讨论】:

      • 不工作。我不认为 async-csv 可以使用 await
      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2014-06-19
      相关资源
      最近更新 更多