1

我正在为一个项目制作一个加密货币仪表板,我对 Node 和 Express 完全陌生。这是我目前拥有的

app.get('/search', function(req,res){
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(req.url);
    data = []
    var options = {
        "method": "GET",
        "hostname": "rest.coinapi.io",
        "path": "/v1/assets",
        "headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
    };

    const request = https.request(options, (data, response) => {    
        response.on('data', d => {
            data.push(d);
        })
    });
    console.log(data);
    request.end();
    res.end();
})

这个想法在我的前端,我有一个按钮,当点击它时,将向 CoinAPI api 发出请求,获取所有报告的资产和当前值。我不太确定我应该如何将该响应数据作为响应发送回我的前端。https.request因此,我尝试从线路返回的 JSON 中提取响应数据。data = []正如您在代码顶部看到的那样,我有一个数据数组。

我最初的请求设置如下:

const request = https.request(options, response => { 

但是当我尝试推送时,我ddata控制台登录并且数据数组为空。这是有道理的,data数组超出了请求函数的范围,因此数据不会更新。但是当我试图传入data函数时,我出错了。

基本上,我希望能够在向 CoinAPI 发出请求后将 JSON 数据发送回我的前端。如果我process.stdout.write(d)https.request回调中这样做,我确实会看到 coinapi 数据回来了。我只是不知道如何将它作为我的响应的一部分发送到前端。

4

2 回答 2

1

问题:

  • 的使用(data, response)不正确。第一个也是唯一的论点是response应该如此(response)

  • on('data')事件接收缓冲数据。将其连接到最终字符串是标准用法,而不是附加数组。

  • 你错过了一个on('end')你应该用来输出最终数据或进行任何处理的东西。

  • 如果目标是输出前端可以解析和使用的 JSON,则使用res.write您正在发送text/html内容类型和一些您不想要的内容。

  • 缺少 API 调用的错误处理程序。

完整更新代码:

app.get('/search', function(req,res){
  let str = '';
  const options = {
    "method": "GET",
    "hostname": "rest.coinapi.io",
    "path": "/v1/assets",
    "headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
  };

  const request = https.request(options, (response) => {
      response.on('data', d => {
        str += d;
      });
      response.on('end', () => {
        try {
          let obj = JSON.parse(str);
          // do any manipulation here
          res.json(obj);
        } catch(e){
          console.log(e);
          res.status(500).json({ message: 'Something went wrong - parse error' });
        }
      });
  });
  request.end();

  request.on('error', (e) => {
    console.log(e);
    res.status(500).json({ message: 'Something went wrong - req error' });
  });
});

我添加了一个JSON.parse()来展示如果您想在将数据发送到前端之前对数据进行一些操作,您将如何处理它。如果您只是想返回 coin API 的准确响应,请使用如下end事件:

response.on('end', () => {
  res.json(str);
});
于 2020-02-28T12:35:30.567 回答
0

要将 JSON 数据作为响应发送回客户端,您只需:

return res.json(data);

就这么简单。:)

于 2020-02-28T09:16:00.090 回答