13

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

4

2 回答 2

14

$resource.get默认情况下,方法期望 JSON 响应是一个对象(在解析时)。调用$resource.get()时,结果将是 $resource 的一个实例。

在您的示例中,调用Member.get({id:1})将生成一个 $resource 实例,该实例是通过调用new Member() 创建的,然后使用解析的 JSON 响应的属性填充(当 XHR 完成时):

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之外的任何其他内容。for (var key in src) { ...所以,如果你给它提供字符串"null",结果将是:

{1: "n", 2: "u", 3: "l", ...}

ngResource 旨在支持 RESTfull API,其中 JSON 作为隐含的数据传输格式,因此您将无法使用响应,例如"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}

演示

于 2014-01-22T22:21:52.170 回答
2

你的代码看起来不错。但是在控制台中看到这种输出是-静音-的痛苦。人们想立即修复它,为结果格式设置任何选项,更改 url,http/https // 摆弄等。

但问题是

调用不允许的 URL,因为用户未登录。

人们期望执行一个不错的so403错误处理程序$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'
  });
于 2014-01-22T20:27:21.183 回答