如何从node.js函数中获取API数据

时间:2018-12-31 06:07:41

标签: node.js

我对JS非常陌生,对Node也非常陌生。我正在尝试制作一个非常简单的应用程序,该应用程序从edamam API(https://rapidapi.com/edamam/api/edamam-nutrition-analysis)中提取JSON数据。我已经使API正常运行,现在我想使用请求返回的数据,但是它卡在了回调函数中,我无法弄清楚如何在检索它的函数之外访问它。

据我所知,这与Node的异步特性有关。我尝试过以我能想到的所有方式对其进行重新排序(超过6个小时!),但是我得到的只是未定义的变量。我想这是因为尚未设置它们,但是我对回调函数没有足够的了解以解决此问题。

最终,我希望能够使用JSON数据来更新HTML元素的内容。

   const unirest = require('unirest');


   var getNutritionInfo = {
        mkString: function(foodStr){
          var ingredients = new Array();
          ingredients.push(foodStr);
          console.log(foodStr)
              params = {
              ingr: ingredients,

          };

          esc = encodeURIComponent;
          query = Object.keys(params)
              .map(k => esc(k) + '=' + esc(params[k]))
              .join('&');

          foodQuery = query.replace(/%20/g,"+");
          return(foodQuery);
        },

        analyse: function(foodStr){
          var cals;
          url = "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data"
          searchQuery = getNutritionInfo.mkString(foodStr);
          function requestData(callback){
              unirest.get(url+"?" + searchQuery)
              .header("X-RapidAPI-Key", "c5c219c7b0mshbf5b602f68caddep1cd8cfjsn01a1be1f45a4")
              .end(function (result) {
                cals = result.body.totalNutrients.ENERC_KCAL.quantity;
                console.log(cals + " first");
                callback();

            });
          }
          requestData(function(){
            console.log(cals + " second");

                getNutritionInfo.getData();


          });
        },

        getData: function(){
          var calories = getNutritionInfo.analyse.cals;
          console.log(calories + " third");
          return calories;
        }
};

最终的console.log始终是未定义的,而我希望它返回校准行上的值(result.body.totalNutrients.ENERC_KCAL.quantity);

我也很抱歉。我知道必须有更干净的方法来组织功​​能和格式化代码。我最终会到达那里的:)

1 个答案:

答案 0 :(得分:0)

  

最终的console.log始终是未定义的,而我希望它返回校准行上的值(result.body.totalNutrients.ENERC_KCAL.quantity);

这是由于nodejs的异步特性。要从SimpleExoPlayerView获取值,您需要将requestData()作为值传递给回调。

进行这些更改,

cal