gpt4 book ai didi

javascript - 如何在 NodeJs 中使用请求进行多个 API 调用?

转载 作者:行者123 更新时间:2023-11-30 20:11:20 24 4
gpt4 key购买 nike

创建一个简单的 Node.Js 应用程序,其中需要显示来自两个 API 的数据,其中两个 API 返回多个具有 ID 的对象。

需要在单个页面上显示来自这两个 API 的数据,并且需要以某种方式根据 ID 从这两个 API 获取数据。

API 1 响应如下所示:

    {
"hikes": [
{
"id": 1,
"active": true,
"name": "Mt. Everest",
},
{
"id": 2,
"active": true,
"name": "K2",
},
{
"id": 3,
"active": true,
"name": "Mt. Kinley",
},
]
}

API 2 响应如下所示:

{
"hikes": [
{
"id": 1,
"slots": 50,
"available": 23,
},
{
"id": 2,
"slots": 20,
"available": 1,
},
{
"id": 3,
"slots": 43,
"available": 20,
},
]
}

需要拉取两个 API,获取数据并在页面上呈现以显示“名称”、“插槽”和“可用”。

到目前为止,我成功地拉取了其中一个 API,并将数据传递给呈现的 index.ejs 页面,但我不确定应该如何拉取第二个 API 以及如何获取数据`s.

我现在的代码是这样的:

var port    = process.env.PORT || 3000,
express = require("express"),
request = require("request"),
app = express();

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





var hikes = {
url: "https://api.com/hikes",
headers: {
'Identifier': identifier
}
};

var availability = {
url: "https://api.com/hikes",
headers: {
'Identifier': identifier
}
};


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


function callback(error, response, body){
if(!error && response.statusCode == 200){
var data = JSON.parse(body);
res.render("index", {data: data});
})
}
}
request(hikes, callback);
});


app.listen(port, function(){
console.log("Running");
});

在我的 index.ejs 中,我现在已经创建了一个简单的循环来打印名字:

<% data["hikes"].forEach(function(hike){ %>

<p><%= hike.name %></p>

<% }) %>

关于如何解决这个问题的任何想法?

谢谢!

最佳答案

如果我没理解错的话,我假设您正在尝试从两个 API 获取数据并希望根据对象 ID 将数据合并到单个对象数组中并将其传递给 View 。如果是这种情况,那么您可以使用 https://www.npmjs.com/package/async从两个 API 并行获取数据,然后将数据合并到一个对象数组中,并将其传递给您的 View 。以下代码将帮助您理解实现。

var port    = process.env.PORT || 3000,
express = require("express"),
request = require("request"),
app = express();

var async = require('async');


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


var hikes = {
url: "https://api.com/hikes",
headers: {
'Identifier': identifier
}
};

var availability = {
url: "https://api.com/hikes",
headers: {
'Identifier': identifier
}
};


app.get("/", function(req, res) {
function callback(error, response, body, cb) {
if(error || response.statusCode != 200)
return cb(true);

cb(null, JSON.parse(body).hikes);//instead of sending data directly to view, send it to async callback to merge it latter
}

var tasks = { // tasks to run in parallel
hikes: function (cb) {
request(hikes, function (error, response, body) {
callback(error, response, body, cb);
});
},
availability: function (cb) {
request(availability, function (error, response, body) {
callback(error, response, body, cb);
});
}
};

async.parallel(tasks, function (err, resp) {
if(err) {
//handle error here, the error could be caused by any of the tasks.
return;
}

var availabilityIdMap = resp.availability.map(function (availability) { return availability.id; });//get an array of all the availability ids
var data = resp.hikes.map(function (hike) { //merging hike to corresponding availability object
var availabilityIndex = availabilityIdMap.indexOf(hike.id); // finding the availability against the hike id.
if(availabilityIndex < 0) //availability not found, just return hike
return hike;

var matchingAvailabilityObj = resp.availability[availabilityIndex]; //get the matching availability object
var mergedObj = Object.assign(hike, matchingAvailabilityObj); //merge both objects
return mergedObj;
});

// now the data will have an array of merged object with properties from hike and availability objects
res.render("index", {data: data});
});
});


app.listen(port, function(){
console.log("Running");
});

关于javascript - 如何在 NodeJs 中使用请求进行多个 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com