Как получить несколько JSON API на одной странице [Nodejs] - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь получить 2 API на одной странице, используя Nodejs и Express. Я исследовал эту проблему и использовал Asyn c и Promise, но не смог применить правильный ответ для своего кода. Есть ли способы, которыми я могу получить данные от 2 API, которые являются 'url' и 'url_test' на одной странице, которая является 'index.e js'?

server. js

app.get('/users', function (req, res) {

  var url = apiUrl + '/users' + apiKey,
      url_test = apiUrl + '/projects' + apiKey;

  request.get(url, function (error, response, body) {
      var bodyData = parseJSON(body);
      res.render('index', {
          apiData: bodyData
      });
  });

  request.get(url_test, function (error, response, body) {
      var bodyData = parseJSON(body);
      res.render('index', {
          apiData-test: bodyData
      });
  });

});

index.e js

<div>
    <% for (var i = 0; i < (apiData.users).length; i++) { %>
        <div><%= (apiData.users[i]).username %></div>
    <% } %>

    <hr>

    <% for (var i = 0; i < (apiData-test.projects).length; i++) { %>
        <div><%= (apiData-test.projects[i]).id%></div>
    <% } %>
</div>

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Вам нужно сделать оба вызова API ПЕРВЫМ, а затем вызвать res.render(), когда у вас есть объединенные результаты. Самый современный способ сделать это - использовать обещания, и вы можете использовать библиотеку запросов-обещаний для той, которая является многообещающей версией библиотеки запросов, которую вы используете в настоящее время:

const rp = require("request-promise");

app.get('/users', function (req, res) {

  var url = apiUrl + '/users' + apiKey,
      url_test = apiUrl + '/projects' + apiKey;

  Promise.all([rp({uri: url, json:true}), rp({uri: url_test, json:true})]).then(([apiData, apiData-test]) => {
      res.render('index', {apiData, apiData-test});
  }).catch(err => {
      console.log(err);
      res.sendStatus(500);
  });
});

json: true опция автоматически проанализирует JSON для вас.


Если вы не знали, библиотека request() и ее производные теперь находятся в режиме обслуживания и не будут получать никаких новых функций. Список альтернатив здесь . Я использую got(), и ваш код, который используется, будет следующим:

const got = require('got');

app.get('/users', function (req, res) {

  var url = apiUrl + '/users' + apiKey,
      url_test = apiUrl + '/projects' + apiKey;

  Promise.all([got(url).json(), got(url_test).json()]).then(([apiData, apiData-test]) => {
      res.render('index', {apiData, apiData-test});
  }).catch(err => {
      console.log(err);
      res.sendStatus(500);
  });
});
0 голосов
/ 10 января 2020

Поскольку вы выполняете рендеринг на стороне сервера, вы отправляете данные внешнего интерфейса (ваш обработанный шаблон e js) в свой ответ API, поэтому на самом деле не имеет смысла нажимать две конечные точки API для получения данных. Вместо этого вы должны включить все данные, которые вы хотите, в один вызов API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...