Как получить несколько ответов API, используя xml2js внутри маршрута Node.js? - PullRequest
0 голосов
/ 03 мая 2019

Я хотел бы сделать несколько вызовов API в рамках маршрута Node.js, используя xml2js, а затем передать каждый результат в testpage.ejs.

Мой код ниже работает для одного запроса API, но яне знаю, как обрабатывать несколько:

const requestPromise = require('request-promise'),
      xml2js = require('xml2js').parseString,
      express = require("express"),
      app = express();

const port = 3200,
      apiURL = 'https://api.example1.com',
      apiURL2 = 'https://api.example2.com';

app.set("view engine", "ejs");

app.use('/public', express.static(__dirname + "/public"));

app.get("/testpage", function(req, res){

    requestPromise.post(apiURL, (error, response, body) => {
    if(error){
        console.log(error);
        return error;
    }
    }).then( (body) => {
        xml2js(body, (err, result) => {

            if(err){
                console.log(err);

            } else {
                res.render("testpage", {myApiObject: result});
                return result;
            }
        });
    });
});


app.listen(process.env.PORT || port, function(){
    console.log("Server is running...");
});

Ниже приведена моя попытка написать функцию "callSecondApi ()", поместить ее в инструкцию "else {" текущего запроса и сохранить результат впеременная (myApiObject2).К сожалению, это не работает, так как я получаю «неопределенную» ошибку на myApiObject2 при попытке записать ее в консоль на testpage.ejs.

function callSecondApi(){
    requestPromise.post(apiURL2, (error, response, body) => {
    if(error){
        console.log(error);
        return error;
    }
    }).then( (body) => {
        xml2js(body, (err, result) => {

            if(err){
                console.log(err);

            } else {
                myApiObject2 = result;
                return result;
            }
        });
    });
}


app.get("/testpage", function(req, res){

var myApiObject2;

    requestPromise.post(apiURL, (error, response, body) => {
    if(error){
        console.log(error);
        return error;
    }
    }).then( (body) => {
        xml2js(body, (err, result) => {

            if(err){
                console.log(err);

            } else {
                callSecondApi();
                res.render("testpage", {myApiObject: result, myApiObject2: myApiObject2});
                return result;
            }
        });
    });
});

Код testpage.ejs:

<html>
    <head>

        <title>
        </title>

    </head>

    <body>

        <p>This is the testpage</p>

        <script>
            var myObj =<%-JSON.stringify(myApiObject)%>
            console.log(myObj);

            var myObj2 =<%-JSON.stringify(myApiObject2)%>
            console.log(myObj2);
        </script>

    </body>
</html>

Буду признателен за любую помощь.

Редактировать: Попытка 2 .Попытался использовать код запроса API в качестве обратного вызова в маршруте Node.js, чтобы получить два ответа API и передать их на тестовую страницу.Это работает в определенной степени.Иногда все работает, как нужно, и консоль печатает, как и ожидалось, в других случаях я получаю

Uncaught SyntaxError: неожиданный токен var

и когда я проверяю «sources» (вХром) Я вижу:

var myObj =
var myObj2 ={"api_response"}

Первый ответ иногда не работает.Я не уверен, что является причиной этого.

Код меняется ниже:

    const requestPromise = require('request-promise'),
          xml2js = require('xml2js').parseString,
          express = require("express"),
          app = express();

    const port = 3200,
          apiURL = 'https://api.example1.com',
          apiURL2 = 'https://api.example2.com';

    app.set("view engine", "ejs");

    app.use('/public', express.static(__dirname + "/public"));

    app.get("/testpage", function(req, res){

    var myApiObj1;
    var myApiObj2;

    // Main function to make API calls
    function firstApiCall(callback){

        requestPromise.post(apiURL, (error, response, body) => {
      if(error){
          console.log(error);
          return error;
      }
      }).then( (body) => {
          xml2js(body, (err, result) => {

              if(err){
                  console.log(err);

              } else {
                  myApiObj1 = result;
                  return result;
              }
          });
      });
      callback();
  }

  // Callback function
  function secondApiCall(){
      requestPromise.post(apiURL2, (error, response, body) => {
      if(error){
          console.log(error);
          return error;
      }
      }).then( (body) => {
          xml2js(body, (err, result) => {

              if(err){
                  console.log(err);

              } else {
                  myApiObj2 = result;

                  res.render("testpage", {myApiObject: myApiObj1, myApiObject2: myApiObj2});
                  return result;
              }
          });
      });
  }

      firstApiCall(function() {
         secondApiCall();
      });
    });


    app.listen(process.env.PORT || port, function(){
        console.log("Server is running...");
    });
...