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

Erro ao pesquisar por titulo do livro - TypeError: Cannot read property 'titulo' of undefined

Boa noite, algum colega sabe por que a variável não esta sendo passada para o método busca_TESTE ?

Estou tentando pesquisar a partir do título do livro.

A query SQL pode estar errada ?

Ao executar, recebo a mensagem no console: TypeError: Cannot read property 'titulo' of undefined

Seguem abaixo os códigos, obrigado pela ajuda:

busca_TESTE(livro){  
    return new Promise((resolve, reject) => {
        this._db.all(
            'SELECT * FROM livros WHERE titulo ?='
            ,
            [
                livro.titulo,
            ],
            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

app.get('/livros/manutencaoLivros/buscaLivros', function(req, resp){ resp.marko(require('../views/livros/manutencaoLivros/buscaLivros/buscaPorTitulo')); console.log("Passou pelo primeiro metodo do busca de livros <<<<<<<<<"); });

app.get('/livros/manutencaoLivros/buscaLivros/resultadoBuscaPorTitulo', function(req, resp){ 
    console.log("Entrou na listagem de livros <<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
    const livroDao = new LivroDao(db);
    // livroDao.lista()
    livroDao.busca_TESTE()
            .then(livros => resp.marko(
                require('../views/livros/manutencaoLivros/buscaLivros/resultadoBuscaPorTitulo.marko'),
                {
                    livros: livros 
                }
            )      
        )
        .catch(erro => console.log(erro));  
});


app.post('/livros/manutencaoLivros/buscaLivros', function(req, resp) {    
    console.log(req.body);
    console.log("Passou pelo POST da busca de livros apos refactor <<<<<<<<<"); 
    const livroDao = new LivroDao(db);
    livroDao.busca_TESTE(req.body)
    .then(resp.redirect('/livros/manutencaoLivros/buscaLivros/resultadoBuscaPorTitulo'))
            .catch(erro => console.log(erro)); 
});
5 respostas

Fala ai Bruno, tudo bem? Está faltando você passar o livro e titulo para sua função busca_TESTE. Repare na sua função:

busca_TESTE(livro){  
    return new Promise((resolve, reject) => {
        this._db.all(
            'SELECT * FROM livros WHERE titulo ?='
            ,
            [
                livro.titulo,
            ],
            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

Ela recebe um livro por parâmetro e quando você está chamando ela: livroDao.busca_TESTE().

Repare que você não passa nenhum parâmetro para ela, sendo assim, o parâmetro livro será undefined e você vai tentar fazer undefined.titulo.

O que vai causar erro.

Para corrigir o problema, sugiro trocar o parâmetro por uma string:

busca_TESTE(titulo){  
    return new Promise((resolve, reject) => {
        this._db.all(
            'SELECT * FROM livros WHERE titulo ?='
            ,
            [
                titulo,
            ],
            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

E quando chamar a função: livroDao.busca_TESTE('algum titulo).

Espero ter ajudado.

Obrigado pela resposta Matheus Castiglioni, de fato faltava passar um parâmetro, no caso foi req.body no método post, conforme o log dentro do método mostra, a variável agora esta sendo passada corretamente, falta agora listar o resultado da consulta, estou trabalhando nisso, seguem os códigos como ficaram:

  app.post('/livros/manutencaoLivros/buscaLivros', function(req, resp) {    
    console.log("Entrou no primeiro post busca de livros <<<<<<<<<<<<<<<<<<<<");
    const livroDao = new LivroDao(db);
    livroDao.listaComPassagemDeParametro(req.body)
    .then(resp.redirect('/livros/manutencaoLivros/buscaLivros/resultadoBuscaPorTitulo'))
            .catch(erro => console.log(erro)); 
});

listaComPassagemDeParametro(livro){
    return new Promise((resolve, reject) => {
        console.log("Entrou na funcao de listagem de livros <<<<<<<<<<<<<<<<<<<<<");
        console.log("Variavel carregada corretamente ---->>>> " + [ livro.titulo ] );
        this._db.all(
            "SELECT * FROM livros WHERE titulo ?=", + [ livro.titulo ],
           // 'SELECT * FROM livros',
            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

Boa Bruno, parabéns.

Um passo de cada vez e tudo da certo.

Sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.

solução!

Boa noite, Bruno! Como vai?

Um outro problema que eu encontrei diz respeito ao comando SQL escrito por vc

'SELECT * FROM livros WHERE titulo ?='

o correto seria fazer

'SELECT * FROM livros WHERE titulo = ?'

assim como foi mostrado nessa atividade para o caso de uma busca por ID!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Obrigado Gabriel Leite, "- Mas professor, eu só errei a vírgula !" :-) , já corrigi a query, a consulta retornou o ID, passando agora para a alteração de registro, bom dia para todos.