Livro MEAN - Expected response to contain an object but got an array

Ao finalizar a leitura/implementação do código do capitulo 5.11, fui realizar o teste da página “http://localhost:3000/#/contato/1” e recebo o erro “Error in resource configuration for action get. Expected response to contain an object but got an array” no console.

Segue link do repositório: https://github.com/darwinboaventura/contatooh

Vou explicar o erro para você ficar mestre no assunto.

Você em Angular usar Contato.get para obter um recurso do servidor. Certo? Por padrão, o get só pode receber um objeto e nunca um array. Então, o resource esta reclamando que você recebeu um array, aliás, a mensagem é bem clara quanto a isso.

Agora, no lado do servidor, em seu controller do Node.js há o seguinte código:


 controller.obtemContato = function(req, res) {
 	var idContato = req.params.id;
 	var contato = contatos.filter(function(contato) {
 		return contato._id == idContato;
 	});
 	console.log(contato);
 	contato ? res.json(contato) : res.status(404).send('Contato não encontrado');
 };

O problema esta i. Como usamos filter, filter cria um novo array (veja, não é um object). Mas como nosso filtro sempre retornará um objecto, precisamos pegar o da primeira posição faltou o [0].


 controller.obtemContato = function(req, res) {
 	var idContato = req.params.id;
 	var contato = contatos.filter(function(contato) {
 		return contato._id == idContato;
 	})[0];  // <-- faltou aqui!
 	console.log(contato);
 	contato ? res.json(contato) : res.status(404).send('Contato não encontrado');
 };

Eu preferi usar filter para buscar o elemento do que fazer um for que é meio procedural o negócio.

Sucesso e bom estudo!

Muito obrigado pela rápida resposta. O problema foi solucionado :grin: