【问题标题】:Node: Hit endpoint that returns a CSV file and send the contents to client节点:点击返回 CSV 文件并将内容发送到客户端的端点
【发布时间】:2017-07-25 13:16:42
【问题描述】:

我得到了一个返回 CSV 文件的端点。我想达到那个终点,读取数据并将其发送给客户端。这就是我现在所拥有的。

app.get('/data', (req, res) => {
  request('foo.com/downloadCSV', (error, response, body) => {
    res.send(csvToJson(body));
  });
});

所以在前端,我点击了“/data”,然后它使用请求库进行调用以获取 CSV 数据。 CSV 的正文位于“正文”中。 'csvToJson' 函数只是将给定的数据格式化为数组/json。

当我在客户端上控制台记录响应时,我的正文是:ReadableStream,locked(...)

如何将数据获取到客户端?

编辑:

这是我的 csvToJson 函数:

const csvToJson = (csv) => {
  const content = csv.split('\r');
  const header = content[0].split(',');
  return _.tail(content).map((row) => {
    return _.zipObject(header, row.split(','));
  });
}

【问题讨论】:

  • 在发送到客户端之前检查服务器端的正文,错误/响应也可能有有用的信息
  • body 正向我展示我想要的东西

标签: node.js csv express


【解决方案1】:

我已经尝试过您的代码,并且可以正常工作。在公用文件夹中,我创建了 sample.csv。

var express = require('express');
var app = express();
var request = require('request');
var _ = require('lodash');

app.use(express.static('public'));

app.get('/data', (req, res) => {
  request('http://localhost:3000/sample.csv', (error, response, body) => {
    res.send(csvToJson(body));
  });
});

const csvToJson = (csv) => {
  const content = csv.split('\n');
  const header = content[0].split(',');
  return _.tail(content).map((row) => {
    return _.zipObject(header, row.split(','));
  });
}

app.listen(3000, function () {
  console.log('Listening on port 3000!')
})

Sample.csv 文件:

a,b,c,d
1,2,3,4
2,1,5,6
54,3,1,12
1,2,3,4

结果:

问题可能在于您从其他服务下载的 csv 文件。

【讨论】:

  • 得到错误:jsonStream.on 不是一个函数。我在编辑中发布了我的 csvToJson 函数
  • 您使用哪个库进行 csv 到 json 的转换?
  • 我没用过。我找到了一个使用 lodash 的函数。该功能在原始帖子中。
  • 我运行了你的代码,我仍然得到 ReadableStream。我从第三方获得 CSV。我能够在前端读取流
【解决方案2】:

我的 React 前端:

componentDidMount() {
  fetch('/data').then(response => {
    var decoder = new TextDecoder();
    var reader = response.body.getReader();

    // read() returns a promise that resolves
    // when a value has been received
    reader.read().then(function processResult(result) {
      if (result.done) return;
      console.log(
        decoder.decode(result.value, {stream: true})
      );

      // Read some more, and recall this function
      return reader.read().then(processResult);
    });
  });
}

这将结束 ReadableStream 并从中获取数据。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多