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


person Petah    schedule 22.01.2014    source источник
comment
почему этим хорошим незаданным вопросам в наши дни уделяется так мало внимания? Кстати, @stewie ответил на вопрос по существу (y)   -  person angabriel    schedule 24.01.2014


Ответы (2)


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

В вашем примере вызов 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}

ДЕМО

person Stewie    schedule 22.01.2014

Ваш код выглядит нормально. Но видеть такой вывод в консоли — это боль в «приглушенном-». Хочется исправить сразу, задавая любые параметры форматов результатов, меняя урлы, http/https// возиться и т.д.

Но дело в том,

Вызов URL-адреса, который не разрешен, поскольку пользователь не вошел в систему.

Ожидается хороший 403 so $resources < strong>обработчик ошибок выполняется.

Таким образом, ваш обработчик результата вообще не выполняется;)

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'
  });
person angabriel    schedule 22.01.2014