Как передать ответ xml2js в переменную в маршруте node.js? - PullRequest
0 голосов
/ 28 апреля 2019

Я использую xml2js с node.js для извлечения данных из API, но мне бы хотелось, чтобы код запускался только при активированном маршруте "/ testpage", который затем назначал бы ответ api переменной и передавал это вместе со скриптом на testpage.ejs, конечной целью которого является вывод содержимого объекта / переменной на консоль.

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю "неопределенный" ответ консоли браузера с приведенным выше кодом.

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

На данный момент я предполагаю, что это может быть асинхронная проблема, но я не уверен, или даже как решить эту проблему, если так.

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

const port = 3200,
  apiURL = 'https://api.exampleapi.com';

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

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

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

var myApiObject; // To store api response

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 {

            myApiObject = result;
            return result;
        }
    });
});

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


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

<!--testpage.ejs-->
<html>
    <head>

    <title>
    </title>

</head>

<body>

    <p>This is the testpage</p>

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

</body>

Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 28 апреля 2019

Вам необходимо отобразить вашу страницу после получения ответа от вызова API. Измените свой код следующим образом:

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;
        }
    });
});
...