为什么 $httpProvider.interceptors 返回一个 `undefined` 值
Why is $httpProvider.interceptors returning an `undefined` value
我创建了一个基本的 AngularJS 应用程序,该应用程序使用 Yelp 的 API,但在使用 $httpProvider.interceptors
解析我的响应时遇到问题。
这是我的应用程序:
var app = angular.module("restaurantList", []);
我的 yelpAPI
服务(未显示)验证我的 API 请求并生成 HTTP 请求。然后我将接收到的数据输出到 Web 控制台,如下所示:
app.controller("mainCtrl", ["$scope", "yelpAPI", function ($scope, yelpAPI) {
$scope.restaurants = [];
yelpAPI.get(function (data) {
$scope.restaurant = data;
console.log($scope.restaurant);
});
}]);
这是我请求的数据:
Object {region: Object, total: 37, businesses: Array[20]}
我想要数组位于 businesses
属性。所以,我认为使用 $httpProvider.interceptors
来解析在 Object.businesses
数组中找到的对象是个好主意。
这是 $httpProvider.interceptors
的样子,当我提出最初的请求时:
app.config(function ($httpProvider) {
$httpProvider.interceptors.push(function () {
return {
response: function (response) {
return response;
}
}
});
});
这是 $httpProvider.interceptors
现在的样子:
app.config(function($httpProvider) {
$httpProvider.interceptors.push(function() {
return {
response: function(response) {
var old_response = response.businesses,
new_response = [];
for (var i = 0; i < old_response.length; i++) {
var obj = old_response[i],
new_obj = {
restaurant_name: obj.name,
phone_number: obj.display_phone,
yelp_rating: obj.rating,
reservation_url: obj.reservation_url
};
new_response.push(new_obj);
}
return new_response;
}
}
});
});
现在,我收到一条错误消息 TypeError: Cannot read property 'businesses' of undefined
。有什么我忽略的吗?
编辑#1
我在拦截器中使用 console.log(response)
来打印我的响应,发现 response.businesses
实际上应该是 response.data.businesses
。这解决了我的错误,但现在我的 $http
调用 returns undefined
。知道我的新问题是什么吗?
编辑 #2
app.factory("yelpAPI", function($http, nounce) {
return {
get: function(callback) {
var method = "GET",
url = "http://api.yelp.com/v2/search";
var params = {
callback: "angular.callbacks._0",
oauth_consumer_key: "my_oauth_consumer_key",
oauth_token: "my_oauth_token",
oauth_signature_method: "HMAC-SHA1",
oauth_timestamp: new Date().getTime(),
oauth_nonce: nounce.generate(),
term: "American",
sort: 2,
limit: 20,
radius_filter: 4000,
deals_filter: true,
actionlinks: true
};
var consumerSecret = "my_consumer_secret",
tokenSecret = "my_token_secret",
signature = oauthSignature.generate(method, url, params, consumerSecret, tokenSecret, {
encodeSignature: false
});
params["oauth_signature"] = signature;
$http.jsonp(url, {
params: params
}).success(callback);
}
}
});
在 return angular 等待对象与 {data : }:
app.config(function($httpProvider) {
$httpProvider.interceptors.push(function() {
return {
response: function(res) {
var old_response = res.businesses,
new_response = [];
for (var i = 0; i < old_response.length; i++) {
var obj = old_response[i],
new_obj = {
restaurant_name: obj.name,
phone_number: obj.display_phone,
yelp_rating: obj.rating,
reservation_url: obj.reservation_url
};
new_response.push(new_obj);
}
return {data : new_response};
}
}
});
});
Return 作为{数据:new_response}
Emir 帮助我解决了这个问题,但基本上,无论何时使用 $httpProvider.interceptors
,都必须更新 response.data
和 return 整个响应对象(即不仅仅是一个新数组,因为我做了)因为 $http
为您选择了 data
属性。
我创建了一个基本的 AngularJS 应用程序,该应用程序使用 Yelp 的 API,但在使用 $httpProvider.interceptors
解析我的响应时遇到问题。
这是我的应用程序:
var app = angular.module("restaurantList", []);
我的 yelpAPI
服务(未显示)验证我的 API 请求并生成 HTTP 请求。然后我将接收到的数据输出到 Web 控制台,如下所示:
app.controller("mainCtrl", ["$scope", "yelpAPI", function ($scope, yelpAPI) {
$scope.restaurants = [];
yelpAPI.get(function (data) {
$scope.restaurant = data;
console.log($scope.restaurant);
});
}]);
这是我请求的数据:
Object {region: Object, total: 37, businesses: Array[20]}
我想要数组位于 businesses
属性。所以,我认为使用 $httpProvider.interceptors
来解析在 Object.businesses
数组中找到的对象是个好主意。
这是 $httpProvider.interceptors
的样子,当我提出最初的请求时:
app.config(function ($httpProvider) {
$httpProvider.interceptors.push(function () {
return {
response: function (response) {
return response;
}
}
});
});
这是 $httpProvider.interceptors
现在的样子:
app.config(function($httpProvider) {
$httpProvider.interceptors.push(function() {
return {
response: function(response) {
var old_response = response.businesses,
new_response = [];
for (var i = 0; i < old_response.length; i++) {
var obj = old_response[i],
new_obj = {
restaurant_name: obj.name,
phone_number: obj.display_phone,
yelp_rating: obj.rating,
reservation_url: obj.reservation_url
};
new_response.push(new_obj);
}
return new_response;
}
}
});
});
现在,我收到一条错误消息 TypeError: Cannot read property 'businesses' of undefined
。有什么我忽略的吗?
编辑#1
我在拦截器中使用 console.log(response)
来打印我的响应,发现 response.businesses
实际上应该是 response.data.businesses
。这解决了我的错误,但现在我的 $http
调用 returns undefined
。知道我的新问题是什么吗?
编辑 #2
app.factory("yelpAPI", function($http, nounce) {
return {
get: function(callback) {
var method = "GET",
url = "http://api.yelp.com/v2/search";
var params = {
callback: "angular.callbacks._0",
oauth_consumer_key: "my_oauth_consumer_key",
oauth_token: "my_oauth_token",
oauth_signature_method: "HMAC-SHA1",
oauth_timestamp: new Date().getTime(),
oauth_nonce: nounce.generate(),
term: "American",
sort: 2,
limit: 20,
radius_filter: 4000,
deals_filter: true,
actionlinks: true
};
var consumerSecret = "my_consumer_secret",
tokenSecret = "my_token_secret",
signature = oauthSignature.generate(method, url, params, consumerSecret, tokenSecret, {
encodeSignature: false
});
params["oauth_signature"] = signature;
$http.jsonp(url, {
params: params
}).success(callback);
}
}
});
在 return angular 等待对象与 {data : }:
app.config(function($httpProvider) {
$httpProvider.interceptors.push(function() {
return {
response: function(res) {
var old_response = res.businesses,
new_response = [];
for (var i = 0; i < old_response.length; i++) {
var obj = old_response[i],
new_obj = {
restaurant_name: obj.name,
phone_number: obj.display_phone,
yelp_rating: obj.rating,
reservation_url: obj.reservation_url
};
new_response.push(new_obj);
}
return {data : new_response};
}
}
});
});
Return 作为{数据:new_response}
Emir 帮助我解决了这个问题,但基本上,无论何时使用 $httpProvider.interceptors
,都必须更新 response.data
和 return 整个响应对象(即不仅仅是一个新数组,因为我做了)因为 $http
为您选择了 data
属性。