Как передать ответ xml2js на переменную в маршруте node.js?

Я использую 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.info(error);
    return error;
}
}).then( (body) => {
    xml2js(body, (err, result) => {

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

        } else {

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

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


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

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

    <title>
    </title>

</head>

<body>

    <p>This is the testpage</p>

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

</body>

Любые идеи о том, что я делаю неправильно?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме