Как получить нулевой ответ от $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.

Ответ 1

$resource.get метод, по умолчанию, ожидает, что ответ JSON будет объектом (при анализе). При вызове $resource.get() результат будет экземпляром ресурса $.

В вашем примере вызов Member.get({id:1}) приведет к экземпляру $resource, который создается путем вызова new Member() 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 построен для поддержки 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}

DEMO

Ответ 2

Ваш код выглядит отлично. Но видеть такой вывод в консоли - это боль в -muted. Один хочет исправить это сразу, установить любые параметры для форматов результатов, изменить URL-адреса, http/https//fiddling и т.д.

Но дело в

Вызов 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'
  });