Я хотел бы сделать несколько вызовов 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...");
});