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

Edição não traz os dados do livro - undefined

Pessoal, fiz todo o passo a passo do curso, mas ao editar um livro o formulário não está sendo preenchido com os dados do mesmo.

Fiz um console.log no ${data.livro.id} no arquivo form.marko e o valor está vindo como undefined.

Podem me ajudar, por favor? Seguem os arquivos do projeto:

form.marko:

<html>
    <body>
        <h1>Cadastro de livros</h1>

        <form action="/livros" method="post">

            <div if(data.livro.id)>
                <input type="hidden" name="_method" value="PUT">
                <input type="hidden" id="id" name="id" value="${data.livro.id}" />
            </div>

            <div>
                <label for="titulo">Título:</label>
                <input type="text" id="titulo" name="titulo" value="${data.livro.titulo}" placeholder="coloque o título">
            </div>
            <div>
                <label for="preco">Preço:</label>
                <input type="text" id="preco" name="preco" value="${data.livro.preco}" placeholder="150.25">
            </div>
            <div>
                <label for="descricao">Descrição:</label>
                <textarea cols="20" rows="20" id="descricao" name="descricao" placeholder="insira a descricao">${data.livro.descricao}</textarea>
            </div>

            <input type="submit" value="Salvar">

        </form>
    </body>
</html>

livro-dao.js:

class LivroDao {

    constructor(db) {
        this._db = db;
    }

<-- métodos lista() e adiciona() -->

    buscaPorId(id) {
        return new Promise((resolve, reject) => {
            this._db.all(`
                SELECT * 
                FROM livros
                WHERE id = ?
            `,
            [id],
            (erro, livro) => {
                if (erro) return reject('Não foi possível encontrar o livro');

                return resolve(livro);
            });
        });
    }

    atualiza(livro) {
        return new Promise((resolve, reject) => {
            this._db.run(`
                UPDATE livros SET
                titulo = ?,
                preco = ?,
                descricao = ?
                WHERE id = ?
            `, [
                livro.titulo,
                livro.preco,
                livro.descricao,
                livro.id
            ],
            erro => {
                if (erro) return reject('Não foi possível atualizar o livro');

                resolve();
            });
        });
    }

    <-- método remove() -->
}

module.exports = LivroDao;

routes.js:

<-- rotas '/' e '/livros' -->

    app.get('/livros/form', (req, res) => 
        res.marko(require('../views/livros/form/form.marko'), { livro: {} })
    );

    app.get('/livros/form/:id', (req, res) => {
        const id = req.params.id;
        const livroDao = new LivroDao(db);

        livroDao.buscaPorId(id)
                .then(livro => 
                    res.marko(
                        require('../views/livros/form/form.marko'),
                        { livro: livro }
                    )
                )
                .catch(erro => console.log(erro));
    });

    app.post('/livros', (req, res) => {
        console.log(req.body);
        const livroDao = new LivroDao(db);
        livroDao.adiciona(req.body)
                .then(res.redirect('/livros'))
                .catch(erro => console.log(erro));
    });

    app.put('/livros', (req, res) => {
        console.log(req.body);
        const livroDao = new LivroDao(db);
        livroDao.atualiza(req.body)
                .then(res.redirect('/livros'))
                .catch(erro => console.log(erro));
    });

<-- rota '/livros/:id' para o método delete -->

Notei que existe essa pergunta já respondida e verifiquei as versões dos pacotes no package.json, está tudo certo.

Só falta esse detalhe pra eu finalizar o curso!

Desde já agradeço, Raphael

3 respostas
solução!

Boa tarde, Raphael! Como vai?

Olhando seu código aqui, a única coisa que percebi é que no método buscaPorId() da classe LivroDao vc faz this._db.all() quando na verdade deveria ser feito this._db.get() como é mostrado nessa atividade. Veja se isso resolve o seu problema.

Caso não resolva, vc poderia compartilhar o seu projeto no github, dropbox ou google drive de forma que eu possa dar uma olhada mais de perto no que está acontecendo? Não esqueça de remover a pasta node_modules antes de compartilhar!

Espero que esteja curtindo e aproveitando ao máximo o conteúdo do curso!

Grande abraço e bons estudos, meu aluno!

Gabriel, boa tarde! Tudo certo!!

Era isso mesmo! Muito obrigado!!!

Por nada, Raphael! Sempre que tiver qualquer dúvida é só mandar aqui no fórum da Alura!

Grande abraço e bons estudos, meu aluno!