AngularJS $resource 服务对 http 请求 response 的自动处理引发的一些问题

默认情况下,$resource 服务会对它进行的 http 请求的 response 默认进行一些处理,它会尝试 map 返回值。

如果你的服务器端返回的值符合标准 json 格式,那么不会遇到问题,但是如果你的服务器返回了类似 12 或者 abc 这样子的数据时,你就会发现当你在回调中试图获取 response 时,发生了一些意想不到的事情。

你实际获得的结果可能是这样子的:

{
  "0": "1",
  "1": "2",
  $promise: obj,
  ...
}
{
  "0": "a",
  "1": "b",
  "2": "c",
  $promise: obj,
  ...
}

你得到的值已经是被错误的 map 过了。这当然不是我们想要的,因此,我们需要手动来处理一下。

所以,我们在 $resource 的对应 action 中指定一下 transformResponse 参数。

顾名思义,transformResponse 就是用来指定对 response 的处理方法的,它接受一个方法或者一个由多个方法组成的数组作为值。

function(data, headersGetter)|Array.<function(data, headersGetter)>

因此我们给 $resource 的某个 action 下添加如下一个参数。

transformResponse: function (response) {
  return {data: response};
}

最终的结构是这样子的:

$resource('/api/test', {}, {
  save: {
    method: 'POST',
    transformResponse: function(response) {
      return {
        data: response
      };
    }
  }
});

这样我们就可以在对应的 action (这里是 save 方法) 的回调中取得我们想要的 response 了。

假设你在回调函数中使用 response 作为回调变量名,你可以通过 response.data来获取真实的 response,它不会再被 angular 自动处理了。