关于rest api的AngularJS自定义查询:动作`get`的资源配置出错

时间:2015-03-06 08:51:54

标签: angularjs rest angular-resource ngresource

我的用户和管理员存储在一个集合中。所有REST API操作都是相同的,但我希望能够分别查询用户列表和管理员列表。 (当我只需要管理员列表时,我不想查询完整的用户列表并在客户端中对它们进行排序)。所以在服务器端我为查询管理员制作了一个自定义URL:

/api/users
/api/users/admins

在客户端,我为Users资源创建了一个自定义方法,仅检索管理员:

// Users service used for communicating with the users REST endpoint
angular.module('users').factory('Users', ['$resource',
    function($resource) {
        return $resource('api/users/:userId', {
            userId: '@_id'
        }, {
            update: {
                method: 'PUT'
            },
            admins: {
                method: 'GET',
                url: 'api/users/admins',
                isArray: true
            }
        });
    }
]);

当我第一次查询()资源时,这工作正常,并且管理列表显示在users/admins上。在我加载一个管理员(在/users/:userId url下打开)并尝试导航回users/admins之后,它会发送一个GET请求以获取管理列表(按预期的对象数组)和我得到以下错误:

错误:[$ resource:badcfg]操作get的资源配置出错。包含一个对象的预期响应但得到一个数组http://errors.angularjs.org/1.3.14/ $ resource / badcfg?p0 = get& p1 = object& p2 = array

如果我点击Admin List菜单项,并按该方式加载状态,则没有错误,视图加载正常。

我还尝试创建一个单独的资源,仅用于查询管理员,但仍然存在相同的错误:

angular.module('users').factory('Admins', ['$resource',
    function($resource) {
        return $resource('api/users/admins');
    }
]);

我做错了什么?处理这些自定义查询的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,以上所有内容似乎都是正确的,事实证明问题出在$ stateProvider配置中。

由于用户视图状态的定义早于管理列表状态,/users/:userId param在通过url查找状态而不是状态名称时选择了/users/admin url。该状态期望单个用户对象而不是用户数组。

state('admin.users.view', {
    url: '/:userId',
    templateUrl: 'modules/users/views/view-user.client.view.html'
}).
state('admin.users.admins', { //extra view for listing admin profiles
    url: '/admins',
    parent: 'admin.users',
    templateUrl: 'modules/users/views/list-admins.client.view.html'
}).

解决方案是更改顺序并更早地定义管理列表状态:

state('admin.users.admins', { //extra view for listing admin profiles
    url: '/admins',
    parent: 'admin.users',
    templateUrl: 'modules/users/views/list-admins.client.view.html'
}).
state('admin.users.view', {
    url: '/:userId',
    templateUrl: 'modules/users/views/view-user.client.view.html'
}).