节点 - 调用 ExpressJS 路由,并需要对其中的 API 执行 GET 请求

Node - Making a call to an ExpressJS route, and need to do a GET request to an API in it

我正在为一个项目制作加密货币仪表板,我对 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 => { 

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

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

要将 JSON 数据作为响应发送回客户端,您需要做的就是:

return res.json(data);

就这么简单。 :)

问题:

  • (data, response)的使用不正确。第一个也是唯一的参数是 response 所以它应该是 (response).

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

  • 您缺少一个 on('end'),您应该使用它来输出最终数据或进行任何处理。

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

  • 缺少 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() 来展示如果您想在将数据发送到前端之前对数据进行一些操作,您将如何处理。如果您只是想 return 硬币的确切响应 API 然后使用 end 事件,例如:

response.on('end', () => {
  res.json(str);
});