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

[Dúvida] O forma de filtrar o arquivo livros.json apresenta funcionamento errado quando novos livros são inseridos cujos "id" iniciam com o mesmo número de "id" menores.

Após realizar a programação do post de inserir novos livros, fiz a inserção do livro id "10". Ao testar o Get para retornar 1 livro específico, nesse exeplo o id 10, é retornado o id 1 da lista de livros.

O que faltou fazer? Att.

Arquivo de dados: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Programação do serviço que filtra o livro por id: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Postman solicitando o livro 10: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Olá, Rafael! Tudo bem?

Pelo que entendi da sua dúvida, você está tendo um problema com a busca de livros por ID. Quando você tenta buscar o livro com ID "10", o sistema retorna o livro com ID "1". Isso provavelmente está acontecendo porque o ID está sendo interpretado como uma string, e não como um número.

Na função getLivroPorId(id) no arquivo de serviço, você está comparando o ID passado como parâmetro com os IDs dos livros no arquivo JSON. No entanto, se o ID passado for uma string, a comparação será feita de forma diferente. Por exemplo, se você passar "10" como ID, a função irá retornar o primeiro livro cujo ID começa com "1", que é o livro com ID "1".

Para resolver este problema, você pode converter o ID para um número antes de fazer a comparação. Aqui está um exemplo de como você pode fazer isso:

function getLivroPorId(id) {
    const livros = JSON.parse(fs.readFileSync("livros.json"))
    const livro = livros.find(livro => livro.id === Number(id))
    return livro
}

Neste exemplo, Number(id) converte a string id para um número. Agora, quando você passar "10" como ID, a função irá retornar o livro com ID 10, e não o livro com ID 1.

Espero ter ajudado e bons estudos!

Bom dia a todos...

Caro Rafael Silva Basso a resposta do colega Matheus Brandino resolve o problema que você nos trouxe, mas o motivo do seu filtro retornar o primeiro registro do seu Json é por que uma string é na verdade um array de caracteres e quando você passa id[0] você está pegando apenas a primeira posição da string"10" que é 1. Bem existem varias maneiras de resolver esse problema, uma das maneiras é como nosso colega já postou e uma outra é remover esse colchete e comparar apenas assim "livros.find(livro => livro.id === id)". Mas lembre-se uma string é sempre uma cadeia(array) de caracteres....

Olá @Matheus Brandino, entendi sua colocação, porém gostaria de manter o Id caracter para nossa discussão, uma vez que o Id pode ser do tipo alfanumérico. Sendo assim não seria possível converter em número pois outro erro iria ocorrer quando o id contiver letras. Então retorno ao ponto, como uma comparaçãode strings com operador === dá True quando sabemos que "1" é diferente de "10", precisamos aqui entender o por que a comparação de string não respeitou a condição de igualdade. obrigado pelo apoio.

solução!

Bom dia, nobre Rafael Silva Basso, desculpe me intrometer, mas a resposta ao questionamento que você fez ao Matheus Brandino eu já te respondi acima, na imagem o seu código está como mostra abaixo.

const livro = livros.find(livro => livro.id === id [0])

Para você ver o valor que está sendo passado no parâmetro Id, basta você colocar um cosole.log(id[0]) e compara com um cosole.log(id) para ver a diferença. O erro está no seu código e não na comparação de "===". Então resumindo retira isso -> [0] do seu código que vai funcionar sem erros. Basta deixar seu código como abaixo:

function getLivroPorId(id) {
    const livros = JSON.parse(fs.readFileSync("livros.json"))
    const livro = livros.find(livro => livro.id === id)
    return livro
}