对 Elasticsearch 数据的 Restangular 调用

Restangular call for Elasticsearch data

我正在尝试使用 restangular api 从 elasticsearch rest 调用中捕获特定数据。我已经尝试了几种不同的方法(包括尝试使用 addResponseInterceptor)。要么我没有正确地做,要么我不明白 how/if 数据的格式可以被 API.

处理

我正在进行的 elasticsearch 调用是“_stats/index,store”。它返回的数据是:

{
  "_shards": {
    "total": 12,
    "successful": 6,
    "failed": 0
  },
  "_all": {
    "primaries": {
      "store": {
        "size_in_bytes": 34177,
        "throttle_time_in_millis": 0
      }
    },
    "total": {
      "store": {
        "size_in_bytes": 34177,
        "throttle_time_in_millis": 0
      }
    }
  },
  "indices": {
    "logstash-2015.05.09": {
      "primaries": {
        "store": {
          "size_in_bytes": 575,
          "throttle_time_in_millis": 0
        }
      },
      "total": {
        "store": {
          "size_in_bytes": 575,
          "throttle_time_in_millis": 0
        }
      }
    },
    ".kibana": {
      "primaries": {
        "store": {
          "size_in_bytes": 33602,
          "throttle_time_in_millis": 0
        }
      },
      "total": {
        "store": {
          "size_in_bytes": 33602,
          "throttle_time_in_millis": 0
        }
      }
    }
  }
}

我感兴趣的数据是每一个指标。任何有关如何使用 restangular api 捕获它的帮助将不胜感激。

我尝试使用以下方法通过 restangular api:

获取数据
app.controller('MainController', ['$scope', 'Restangular',
  function($scope, Restangular) {
    var restCall = Restangular.all('_stats/index,store');
    var allData = restCall.get();
    var allData2 = restCall.getList();
  }]);

get 和 getList 因不同的错误而失败。

得到returns: 类型错误:无法读取未定义的 属性 'toString'

获取列表returns: 错误:getList 的响应应该是数组而不是对象或其他东西

谢谢你,格雷格

Restangular 使用承诺。可以尝试这样做:

app.controller('MainController', ['$scope', 'Restangular',
  function($scope, Restangular) {
      Restangular.all('_stats/index,store').getList().then(function(response) {
        $scope.indices = response.getList("indices");
      });
  }
]);

然而,由于 Restangular 的 getList() 调用期望响应包含一个 JSON 数组,而 Elasticsearch 响应是一个普通的 JSON 对象(即其中没有任何数组),我们需要告诉 Restangular 在响应中在哪里找到数组。由于有 none 我们可以拦截响应并自己构建一个 using addResponseInterceptor.

app.config(function(RestangularProvider) {
    // add a response intereceptor
    RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
      var extractedData;
      if (operation === "getList" && what === "indices") {
        extractedData = {indices: Object.keys(data.indices)};

        // now we have an array called "indices" with the index names "logstash-2015.05.09" and ".kibana" in it

      } else {
        extractedData = data.data;
      }
      return extractedData;
    });
});