【问题标题】:$resource.query return split strings (array of char) instead of a string$resource.query 返回拆分字符串(字符数组)而不是字符串
【发布时间】:2026-01-12 03:15:01
【问题描述】:

我正在使用如下所示的有角度的 $resource。

angular.module('app')
.factory('data', function ($resource) {

    var Con = $resource('/api/data', {}, {
        update : {method : 'PUT'}
    });

    return {     

        getData : function (user_id, callback) {

             return Con.query({user_id : user_id}, function (data) {
                 cb(data); // (breakpoint) HERE data is not good
             }, function (err) {
                 cb(err);
             }).$promise;
         }

   }; 
});

这是在数据上设置断点时得到的结果:

[
    ['w','e','l','c','o','m','e'],
    ['h','e','l','l','o']
] 

但是,服务器发送:

['welcome','hello']

有人知道为什么字符串会被拆分吗?

谢谢

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您遇到了 Angular 的 $resource 的一个有趣的错误,它无法处理原始字符串数组;作为一种解决方法,您可以做以下三件事之一:

    • 改用 $http 服务
    • 通过服务器发送一个对象包装的响应,例如:{ "stuff" : [ "your", "strings" ] }
    • 客户端将响应数据强制转换为上述格式; $resource 例如:methodName: {method:'GET', url: "/some/location/returning/array", transformResponse: function (data) {return {list: angular.fromJson(data)} }} 然后以data.list 访问它

    https://*.com/a/22491240/626810查看我的回答

    【讨论】:

    • 如果服务器返回 JSON 字符串,此问题和答案也适用
    【解决方案2】:

    这适用于 RAW 响应。这与上面的答案略有不同,但这是通用的,不仅依赖于 JSON 响应。这基本上会改变 RAW 对字符串格式的响应。您需要以 result.responseData

    的形式访问 $resource 承诺结果
    getAPIService() {
        return this.$resource(this.apiUrl, {}, {
            save: {
                method: 'POST',
                headers: {
                    'Accept': 'text/plain, text/xml',
                    'Content-Type': 'text/xml'
                },
                transformResponse: function (data) { return { responseData: data.toString() } }
            }
        });
    }
    

    【讨论】:

      【解决方案3】:

      使用 $http 代替 $resource

      getRiskCount: function (Id,Type) {
                  var deferred = $q.defer();
                  var resource = $resource(urlResolverFactory.hostUrl() + '/api/getstudentriskcount',
                      {}, { query: { method: 'GET', isArray: false } }
                   );
                   resource.query({ userId: Id,userType: Type }, function (data) {
                       deferred.resolve(data);
                    }, function (error) {
                        deferred.reject(error);
                    });
                   return deferred.promise;
                }
      
        Result - ['4','5','6','7']
      
       getRiskCount: function (Id,Type) {
                      var apiUrl = urlResolverFactory.hostUrl() + '/api/getstudentriskcount';
                      apiUrl += '?userId=' + Id,
                      apiUrl += '&userType=' + Type;
      
                      var deferred = $q.defer();
                      var promise = $http({
                          method: 'GET',
                          url: apiUrl,
                      }).success(function (data) {
                          deferred.resolve(data);
                      }).error(function (data, status) {
      
                          deferred.reject(data);
                      });
                      return promise;
                  }
      
        Result - [4567]
      

      【讨论】: