Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Error: $resource:badcfg

Olá a Todos,

Estive realizando alguns testes tentando cadastrar Usuários usando o mesmo jeito que foi montado o cadastro de fotos.

Mas ao editar o Angular está me retornando um erro:

angular.min.js:102 Error: [$resource:badcfg] http://errors.angularjs.org/1.3.15/$resource/badcfg?p0=get&p1=object&p2=array
    at Error (native)
    at http://localhost:3000/js/lib/angular.min.js:6:417
    at q.then.p.$resolved (http://localhost:3000/js/lib/angular-resource.min.js:9:330)
    at http://localhost:3000/js/lib/angular.min.js:112:113
    at n.$eval (http://localhost:3000/js/lib/angular.min.js:126:15)
    at n.$digest (http://localhost:3000/js/lib/angular.min.js:123:106)
    at n.$apply (http://localhost:3000/js/lib/angular.min.js:126:293)
    at l (http://localhost:3000/js/lib/angular.min.js:81:240)
    at M (http://localhost:3000/js/lib/angular.min.js:85:342)
    at XMLHttpRequest.F.onload (http://localhost:3000/js/lib/angular.min.js:86:367)


Error: $resource:badcfg
Response does not match configured parameter

Error in resource configuration for action `get`. Expected response to contain an object but got an array (Request: {3} {4})

Montei basicamente igual o cadastro de Foto, segue abaixo os arquivos:

Usuarios-Servicos.js

angular.module('usuariosServicos', ['ngResource'])
    .factory('recursoUsuario', function($resource) {

        return $resource('/v1/usuarios/:idcrmusuario', null, {
            'update' : { 
                method: 'PUT'
            }
        });
    })    
    .factory("cadastroDeUsuarios", function(recursoUsuario, $q) {
        var service = {};
        service.cadastrar = function(usuario) {
            return $q(function(resolve, reject) {

                if(usuario.idcrmusuario) {
                    recursoUsuario.update({idcrmusuario: usuario.idcrmusuario}, usuario, function() {
                        resolve({
                            mensagem: 'Usuario ' + usuario.nome + ' atualizado com sucesso',
                            inclusao: false
                        });
                    }, function(erro) {
                        console.log(erro);
                        reject({
                            mensagem: 'Não foi possível atualizar o usuario ' + usuario.nome
                        });
                    });

                } else {
                    recursoUsuario.save(usuario, function() {
                        resolve({
                            mensagem: 'Usuario ' + usuario.nome + ' incluído com sucesso',
                            inclusao: true
                        });
                    }, function(erro) {
                        console.log(erro);
                        reject({
                            mensagem: 'Não foi possível incluir o usuario ' + usuario.nome
                        });
                    });
                }
            });
        };
        return service;
    });

usuario-controller.js

angular.module('alurapic')
    .controller('UsuarioController', function($scope, recursoUsuario, $routeParams, cadastroDeUsuarios) {

        $scope.usuario = {};
        $scope.mensagem = '';

        if($routeParams.idcrmusuario) {
            recursoUsuario.get({idcrmusuario: $routeParams.idcrmusuario}, function(usuario) {
                $scope.usuario = usuario; 
            }, function(erro) {
                console.log(erro);
                $scope.mensagem = 'Não foi possível obter o Usuario'
            });
        }

        $scope.submeter = function() {

            if ($scope.formulario.$valid) {
                cadastroDeUsuarios.cadastrar($scope.usuario)
                .then(function(dados) {
                    $scope.mensagem = dados.mensagem;
                    if (dados.inclusao) $scope.usuario = {};
                })
                .catch(function(erro) {
                    $scope.mensagem = erro.mensagem;
                });
            }
        };
    });

Pelo que andei pesquisando o erro pode estar no $resource quando fazemos o GET, mas já implementei várias alterações e não consegui corrigi-lo.

Agradeço a ajuda de todos!

4 respostas

O problema está na implementação do seu backend. Veja a mensagem que o angular exibe:

error in resource configuration for action `get`. Expected response to contain an object but got an array (Request: {3} {4})

Resource espera receber um objeto e esta recebendo um array. No get você só pode retornar um objeto, nunca um array.

Acessa o endereço no navegador e veja como ele está sendo devolvido.

Abraço Alan!

Flávio, ao acessar o endereço http://localhost:3000/v1/usuarios/2 diretamente pelo Browser, o que me retorna são os dados que foram cadastrados no banco :

[{"idcrmusuario":2,"nome":"Alan Lopes","login":"alanlopes","senha":"123456","email":"alan@hotmail.com"}]

Esse seria o formato correto, não seria ?

No backend eu fiz exatamente como o curso de MEAN STACK, só que tentei a implementação com Sequelize, porque conecto em um banco SQL SERVER.

usuario.js no backend

api.lista = function(req, res) {

    models.Usuario
        .findAll()
        .then(function(usuarios) {
            res.json(usuarios);
        }, function(error) {
            console.log(error);
            res.status(500).json(error);
        });
};

api.buscaPorId = function(req, res) {

    models.Usuario
        .findAll({
            where: {idcrmusuario: req.params.id} })
        .then(function(usuario){
            if (!usuario) throw Error('Usuario não encontrado');            
            res.json(usuario);            
        }, function(error){
            console.log(error);
            res.status(404).json(error);
        });
};

O Lista funciona corretamente, traz no ngTable todos os dados.

Obrigado pelo help.

solução!

O retorno:

[{"idcrmusuario":2,"nome":"Alan Lopes","login":"alanlopes","senha":"123456","email":"alan@hotmail.com"}]

É um array. Por isso você esta tendo erro no Angular. Se você usa $resource.get o que deve ser retornado não é uma lista, mas um objeto.

{"idcrmusuario":2,"nome":"Alan Lopes","login":"alanlopes","senha":"123456","email":"alan@hotmail.com"}

Se você esta usando sequelize, tem que ver a documentação dele, porque ele está retornando para você uma lista, e não um objeto JavaScript.

Como não uso o Sequelize, não sei dizer porque ele está fazendo isso. Sendo assim, o problema não é no código que você aprendeu no curso de MEAN, mas o uso do Sequelize que, evidentemente, está retornando um array no lugar de um objeto quando você o busca do banco.

Consegui Alan? Talvez seja suficiente fazer um [0] no registro retornado pelo sequelize. :)