如何从$ resource获得空响应?
我正在运行:
angular.module("services").factory('Member', function($resource) {
var Member = $resource('/api/v1/member.json');
Member.current = Member.get();
return Member;
});
但是服务器正在响应:
null
因为用户未登录。
但是当我记录结果时,我得到了这个:
Resource
0: "n"
1: "u"
2: "l"
3: "l"
$promise: Object
$resolved: true
__proto__: Resource
我希望字面意思null
。
答案 0 :(得分:14)
$resource.get
方法期望JSON响应成为对象(解析时)。
调用$resource.get()
时,结果将成为$ resource的一个实例。
在您的示例中,调用Member.get({id:1})
将生成一个$ resource实例,该实例是通过调用new Member()
source然后populated source(当XHR完成时)使用已解析的JSON响应的属性创建的:
shallowClearAndCopy(data, value);
用于填充Member
实例的函数的签名如下:
function shallowClearAndCopy(src, dst) {
dst = dst || {};
angular.forEach(dst, function(value, key){
delete dst[key];
});
for (var key in src) {
if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') {
dst[key] = src[key];
}
}
return dst;
}
浏览函数体时,您会发现该函数不希望src
参数成为除了object(for (var key in src) { ...
)以外的任何其他参数。因此,如果您为其提供字符串"null"
,结果将为:
{1: "n", 2: "u", 3: "l", ...}
ngResource构建为支持使用JSON作为隐含数据传输格式的RESTfull API,因此您将无法使用"null"
之类的响应或其他任何不是有效JSON的响应。
<小时/> 的除非强>
除非您使用transformResponse
将"null"
转换为{'null': true}
之类的内容:
app.factory('Member', function($resource) {
var Member = $resource('member.txt', {}, {
get: {
method: 'GET',
isArray: false,
transformResponse: function(data, headersGetter){
if(data === 'null'){
return {null: true};
}
return angular.fromJson(data);
}
}
});
return Member;
});
$scope.member = Member.get({id: 1});
console.log($scope.member); // --> {null: true}
<强> DEMO 强>
答案 1 :(得分:2)
您的代码看起来很好。但是在控制台中看到这种输出是一个痛苦的 - 静音 - 。一个人想立即修复它,为结果格式设置任何选项,更改网址,http / https //摆弄等等。
但事情是
调用不允许的URL,因为用户未登录。
我们期待一个不错的403
,以便执行$resource
错误处理程序。
这样你的结果处理程序根本不会执行;)
Member.current = Member.get; //note removed () here
// then outside call:
Member.current(
function(result) {
// should not execute for 403
},
function(fault) {
// TODO: handle case: 'user not logged in'
});