【问题标题】:How do I get a null response from a $resource?如何从 $resource 获得空响应?
【发布时间】:2014-02-13 01:59:55
【问题描述】:

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

【问题讨论】:

  • 为什么这些天来这些没有被问到的好问题很少受到关注?顺便说一句,@stewie 回答了这个问题(y)

标签: javascript angularjs angularjs-resource


【解决方案1】:

$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 参数是对象(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

【讨论】:

    【解决方案2】:

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

    但事情是

    调用一个不允许的 URL,因为用户没有登录。

    人们期待一个不错的403,所以$resources 故障处理程序会执行。

    这样你的结果处理程序根本不会执行;)

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

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多