angular 返回对象时出现资源错误

angular resource error when objects are returned

我正在使用 angular 的资源查询一些数据,问题是查询 returns 不是这个:

[
    {"id":"5-w2k93ylznp6tj4i"}
    {"id":"6-njzmmwcpkw23ayvi"}
]

是这个:

{"id":"5-w2k93ylznp6tj4i"}
{"id":"6-njzmmwcpkw23ayvi"}

我得到的不是对象数组,而是几个对象,这使得 angular 抛出此错误:

SyntaxError: Unexpected token {
at Object.parse (native)

我认为错误是因为它不期望另一个对象。该查询针对两个项目,如果我只查询 1 个项目,我只会得到一个对象并且没有错误。我怀疑当有两个项目时,它不期望第二个对象并在第一个对象结束后在第一个大括号中抛出错误。

一些代码:

这是资源:

list: resource (
            '/api/products',
            {
                limit: '@limit',
                skip: '@skip',
                sort: '@sort'
            }, 
            {
                query: {
                    method: 'GET',
                    interceptor: {
                        response: function (data) {
                            console.log('response in interceptor', data);
                        },
                        responseError: function (data) {
                            console.log('error in interceptor', data);
                        }
                    },
                    isArray: false
                }
            }
        ) 

资源使用位置:

 factory.loadProducts = function(skip, sort){
    var data = Api.Product.list.query(
        {
            limit: appDataVars.limit,
            skip: skip,
            sort: sort
        }, function(response)
        {
            appDataVars.productsList = response;
        }, function(error)
        {
            console.error(error);
        });

    return data.$promise;
};

总是命中错误回调。

我的问题是我无法修改 api,我必须找到一种方法来处理 angular 中的结果集。知道我该如何实现吗? 谢谢。

设置资源的查询对象包含一个属性 for transformResponse set to the empty array:

query: {
    method: 'GET',
    interceptor: {
        response: function (data) {
            console.log('response in interceptor', data);
        },
        responseError: function (data) {
            console.log('error in interceptor', data);
        }
    },
    isArray: false,
    transformResponse: []
}

这将强制将响应视为字符串,然后将处理响应的函数更改为:

function(response)
{
    appDataVars.productsList = eval('[' + response.replace(/\n/g, ',') + ']');
}

如果响应字符串没有被对象之间的换行符分隔,则将其更改为 response.replace(/}\s*{/g, '},{')(尽管这是一个非常幼稚的正则表达式)。

这有点 hacky,但它应该是一种解决方法,因为您无法修改 API。