Я использую 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>
Любые идеи о том, что я делаю неправильно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо отобразить свою страницу после получения ответа от вызова 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;
}
});
});