Передача ответа от API как ответа от моего сервера узлов - PullRequest
0 голосов
/ 03 марта 2019

В некоторых случаях, когда на мой узел / экспресс-сервер попадает определенный маршрут, я хотел бы сделать запрос к API и вернуть этот ответ непосредственно клиенту.Я следовал за этим сообщением переполнения стека: Отправка ответа от серверного запроса axios в приложение React / Redux

Чтобы создать это:

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, избегайте TypeError: Преобразование круговой структуры в JSON

Я пытался использовать библиотеку npm flatted, добавив этот импорт:

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

и приведя в строку перед моим ответом:

res.send(stringify(scratchResponse));

Но похоже, что некоторая информацияудалено, что критично для клиента (клиент ломается и говорит, что ему не хватает свойств).

Можно ли напрямую отправить ответ, который я получаю от API?

1 Ответ

0 голосов
/ 03 марта 2019

Ну, возможно, самый простой способ - передать ответ клиенту:

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

Если есть проблема с форматом от третьей стороны, вам все равно не повезло, ноэто, по крайней мере, приведет к тому, что обработка на стороне сервера будет исключена, а производительность будет немного выше, поскольку вы просто передаете ответ, а не получаете полный ответ на сервере, сериализуя его только в JSON.повторно отправить его в поток ответов.

...