Узел - Выполнение вызова по маршруту ExpressJS, и необходимо выполнить запрос GET к API в нем - PullRequest
1 голос
/ 28 февраля 2020

Я делаю панель управления криптовалютой для проекта, и я совершенно новичок в 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();
})

Идея на моем внешнем интерфейсе, у меня есть кнопка, которая при нажатии делает запрос к API CoinAPI, получая все зарегистрированные активы и текущие значения. Я не совсем уверен, как я должен отправлять эти данные обратно на мой интерфейс в качестве ответа. Итак, я попытался извлечь данные ответа из JSON, возвращаемого строкой https.request. У меня есть массив данных data = [], как вы можете видеть в верхней части моего кода.

Первоначально мой запрос был настроен так:

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

, но когда я попытался поставить sh d на data, я вошел в систему, и массив данных был опорожнить. Это имеет смысл, массив data выходит за рамки функции запроса, поэтому данные не обновляются. Но когда я попытался передать data в функцию, я допустил ошибку.

По сути, я хочу иметь возможность отправить данные JSON обратно в мой интерфейс после отправки запроса в CoinAPI. Если я сделаю process.stdout.write(d) в моем https.request обратном вызове, я действительно вижу, как возвращаются данные coinapi. Я просто не знаю, как отправить его на фронт как часть моего ответа.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Проблемы:

  • Использование (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(), чтобы показать, как вы справитесь с этим, если хотите выполнить некоторые манипуляции с данными перед отправкой их во внешний интерфейс. Если вы просто хотите вернуть точный ответ API-интерфейса для монет, используйте событие end, например:

response.on('end', () => {
  res.json(str);
});
0 голосов
/ 28 февраля 2020

Чтобы отправить JSON данные обратно клиенту в качестве ответа, все, что вам нужно сделать, это:

return res.json(data);

Это так просто. :)

...