如何从$资源获得空响应?

时间:2014-01-22 19:52:46

标签: javascript angularjs angularjs-resource

如何从$ 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

2 个答案:

答案 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'
  });