最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin14浏览0评论

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

如何在NodeJs中使用请求进行多个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: "",
    headers: {
      'Identifier': identifier
    }
  };

  var availability = {
    url: "",
    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/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/hikes",
  headers: {
   'Identifier': identifier
  }
};

var availability = {
  url: "https://api/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");
});
发布评论

评论列表(0)

  1. 暂无评论