如何使用NodeJ中的请求进行多个API调用?

对象类

创建一个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,以及一些如何获取数据的方法。

目前,我的代码如下所示:

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将数据合并到单个对象数组中,并将其传递给视图。如果是这种情况,则可以使用https://www.npmjs.com/package/async从两个API并行获取数据,然后将数据合并到一个对象数组中并将其传递给视图。以下代码将帮助您理解实现。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用python请求进行多个api调用

如何使用Android Studio和Web Api通过相同的请求进行发布和获取

使用瓶颈对库中的 API 请求进行速率限制

避免在PHP中对API请求进行硬编码XML

无法在 Laravel 中使用 API 请求进行更新

如何在Laravel 8中使用请求进行验证?

如何在Laravel中未经请求进行验证

如何正确使用Siege对GET请求进行基准测试?

如何防止使用异步请求进行多次验证?

如何在 Express 中使用请求进行 POST

节点:如何使用https模块对请求进行分页?

使用python中的请求进行curl命令复制

使用Python脚本响应中的请求进行Web抓取

使用ReactJS中的axios请求进行错误处理

多个请求进行翻新以合并结果

如何使用AWS Web API和Lambda对无服务器Web请求进行身份验证?

如何使用 express-swagger-generator npm 在 NodeJs 中对 base64 中的 swagger 请求进行编码

Javascript中的Ajax请求进行循环

使用请求进行网页搜集-Python

请求调用如何在NodeJ / ExpressJ中工作?

如何处理NodeJ中的多个并行请求

使用多个AJAX请求进行laravel 5.2 mysql批量插入,toSql()错误

Rails&Devise使用POST请求进行注销。如何将其更改为DELETE请求?

Node.js请求模块....在主体中发送JSON以使用api请求进行API请求

在N秒内对M个请求进行节流方法调用

使用导航卫士或针对每个API请求进行角色/帐户检查

使用 Stripe API 时,是对每个请求进行排序还是本地存储并执行查询更好?

如何在Java中对改装的反应式请求进行反抖动?

如何在Codename One中模拟服务器/ http请求进行测试?