0

我的 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
}

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

任何帮助将不胜感激。

苹果电脑

4

2 回答 2

0

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

我需要做的就是使用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())
}
于 2021-06-16T13:04:38.443 回答
0
 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]在(站点)搜索框中使用“”搜索此站点以获取更多信息。

于 2021-06-16T12:09:24.883 回答