【问题标题】:CSV convert to JSON Returning as an empty arrayCSV 转换为 JSON 返回为空数组
【发布时间】:2021-06-16 21:04:38
【问题描述】:

我的 next.js 项目中有一个 API 路由,其想法是它处理来自我工作的公司正在使用的 API 的统计信息。它可以毫无问题地通过整个函数,直到需要将 CSV 转换为 JSON 数组,然后返回为 []

我想如果我删除 CSVtoJSON 转换代码并运行以下载文件,然后更改代码使其具有 CSVtoJSON 代码,但删除文件的下载,它会将 CSV 解析为我想要的 JSON,而不会出现问题。

我正在使用 asyn/await 函数,所以我不确定为什么当我尝试将它作为一个完整函数运行时它会将文件读取为空,但如果我单独运行每个块则不会。

// logs.ts
import {NextApiRequest, NextApiResponse} from 'next'
import {processStats, fetchCsv, downloadFile} from './functions'

export default async (req: NextApiRequest, res: NextApiResponse) => {
 const request = await processStats(1, 1, 'UTC', 'records', 'calls')
 const csv_url = await fetchCsv(request.request_id)
 const parsedf = await downloadFile(csv_url.download_url)
 res.status(200).json(parsedf)
}
// downloadFile function
export async function downloadFile(url) {
  const fs = require('fs')
  const https = require('https')
  const csv = require('csvtojson')

  const fp = await fs.createWriteStream('pages/api/stats/data.csv')
  const req = await https.get(url, function (res) {
    res.pipe(fp)
  })

  const jsonArray = await csv().fromFile('pages/api/stats/data.csv')
  return jsonArray
}

不会抛出任何错误,它只会发回空的 [] 数组。

任何帮助将不胜感激。

苹果机

【问题讨论】:

标签: javascript node.js reactjs next.js csvtojson


【解决方案1】:
 const fp = await fs.createWriteStream('pages/api/stats/data.csv')
 const req = await https.get(url, function (res) {
    res.pipe(fp)
 })

只等待微任务队列作业运行,因为https.get 不返回承诺。它需要重写以处理从 get 请求到管道的所有数据的获取和写入,并可能在发起调用之前关闭管道

 const jsonArray = await csv().fromFile('pages/api/stats/data.csv')

最好的资源是https.gethttp.get 的组合文档。据我了解,需要监控响应对象上触发的dataend 事件。

在(站点)搜索框中使用“[node.js] http.get data chunk]”搜索此站点以获取更多信息。

【讨论】:

    【解决方案2】:

    就在我准备放弃的时候,我想出了如何解决这个问题。

    我需要做的就是使用fs.readFileSync('pages/api/stats/data.csv) 将文件内容读入字符串,然后使用return csv().fromString(data.toString())

    这行得通。最终代码如下。

    export async function downloadFile(url) {
      const https = require('https')
      const fs = require('fs')
      const fp = fs.createWriteStream('pages/api/stats/data.csv')
      const csv = require('csvtojson')
    
      https.get(url, function (res) {
        res.pipe(fp)
      })
      var data = fs.readFileSync('pages/api/stats/data.csv')
      return csv().fromString(data.toString())
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2015-03-05
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多