从API传递响应作为节点服务器的响应抛出

时间:2019-03-03 19:17:45

标签: node.js express axios

在某些情况下,当在我的节点/ Express服务器上命中特定路由时,我想向API发出请求,并将该响应直接返回给客户端。我遵循了这个堆栈溢出文章:Send response from server side axios request to React/Redux app

要创建此文件:

router.use('/', async (req, res) => {
  const apiUrl = `https://assets.scratch.mit.edu${req.url}`;
  console.log(apiUrl);
  const scratchResponse = await axios.get(apiUrl);
  try {
    res.send(scratchResponse);
    console.log('worked!', apiUrl);
  } catch (error) {
    console.log('error in assets get request', apiUrl, error);
    res.sendStatus(500);
  }
});

这适用于某些请求,但由于错误而中断了其他请求:

TypeError: Converting circular structure to JSON

根据此堆栈溢出帖子中的建议:JSON.stringify, avoid TypeError: Converting circular structure to JSON

我尝试通过添加以下导入内容来使用npm flatted库:

const { stringify } = require('flatted/cjs');

在我回复之前先进行细化:

res.send(stringify(scratchResponse));

但是似乎某些对客户端至关重要的信息已被删除(客户端中断并表示缺少属性)。

是否可以直接发送从API接收到的响应?

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是将响应传递给客户端:

  router.get('/', (req, res) => {
    axios({
      method: 'get',
      url: apiUrl,
      responseType: 'stream'
    })
      .then(function(response) {
        response.data.pipe(res)
    });
  });

如果第三方格式有问题,您仍然会感到不走运,但这至少会使服务器端处理成为问题,并且性能应该会更好一些由于您只是向下传递响应,而不是在服务器上获取完整的响应,因此将其序列化为JSON只是将其重新发送到响应流。