将来自 API 的响应作为来自我的节点服务器的响应抛出

Luk*_*gen 10 node.js express axios

在某些情况下,当我的节点/快递服务器上遇到特定路由时,我想向 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

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

TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)

根据此堆栈溢出帖子的建议:JSON.stringify,避免 TypeError:将循环结构转换为 JSON

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

const { stringify } = require('flatted/cjs');
Run Code Online (Sandbox Code Playgroud)

并在我的回应之前进行字符串化:

res.send(stringify(scratchResponse));
Run Code Online (Sandbox Code Playgroud)

但是似乎正在删除一些对客户端至关重要的信息(客户端中断并说它缺少属性)。

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

Pau*_*aul 20

好吧,最简单的方法可能是将响应通过管道传递给客户端:

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

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

  • `responseType: 'stream'` 是我们所缺少的,谢谢! (6认同)