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

Erro: 'this._db.all is not a function'

Eu segui o código, mas dá um erro que não sei resolver. Na linha de comando aparece isso:

TypeError: this._db.all is not a function
    at C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\src\app\infra\livro-dao.js:9:22
    at new Promise (<anonymous>)
    at LivroDao.lista (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\src\app\infra\livro-dao.js:8:16)
    at C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\src\app\rotas\rotas.js:23:18
    at Layer.handle [as handle_request] (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\mauri\Google Drive\Alura\Node.js Parte 1 Inovando com JavaScript no backend\node_modules\express\lib\router\index.js:335:12)

O que poderia ser?

3 respostas

PS: Meu código:

rotas.js

const LivroDao = require('../infra/livro-dao');
const db = require('../../config/database');

module.exports = (app) => {
    app.get('/', function(req, resp) {
        resp.send(
            `
                <html>
                    <head>
                        <meta charset="utf-8">
                    </head>
                    <body>
                        <h1> Casa do Código </h1>
                    </body>
                </html>
            `
        );
    });

    app.get('/livros', function(req, resp) {

        const livroDao = new LivroDao(db);
        livroDao.lista()
                .then(livros => resp.marko(
                    require('../views/livros/lista/lista.marko'),
                    {
                        livros: livros
                    }
                ))
                .catch(erro => console.log(erro));
        // livroDao.lista(function(erro, resultados) {

        //     resp.marko(
        //         require('../views/livros/lista/lista.marko'),
        //         {
        //             livros: resultados
        //         }
        //     );

        // });
    });
}

livro-dao.js

class LivroDao {

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

    lista() {
        return new Promise((resolve, reject) => {
            this._db.all(
                'SELECT * FROM livros',
                (erro, resultados) => {
                    if (erro) return reject('Não foi possível listar os livros!');

                    return resolve(resultados);
                }
            )
        });
    }
}

module.exports = LivroDao;
solução!

Olá Maurício, tudo bem com você?

Realmente, seus códigos estão idênticos ao do professor, não era para estar ocasionando nenhum erro

O problema que ele está dando é como se o nosso arquivo de banco de dados não tivesse a função all, você pode conferir se o caminho do arquivo database está correto, aqui:

const db = require('../../config/database');

Caso esteja você pode fazer um teste para checar se o banco de dados está funcionando corretamente ?

Comente o seu código atual utilizando o DAO, para o código antigo e veja se também acontece algum erro

    app.get('/livros', function(req, resp) {

        db.all('SELECT * FROM livros', function(erro, resultado){
            resp.marko(
                require('../views/livros/lista/lista.marko'),
                {
                    livros: resultado
                }
            )
        })

        // const livroDao = new LivroDao(db);
        // livroDao.lista()
        //         .then(livros => resp.marko(
        //             require('../views/livros/lista/lista.marko'),
        //             {
        //                 livros: livros
        //             }
        //         ))
        //         .catch(erro => console.log(erro));
    });

Caso tenha poste aqui nos comentários para a gente dar uma olhada :)

Abraços e Bons Estudos!

A culpa do erro era minha mesma, você respondeu certo, minha pergunta que foi errada, mas mesmo assim sua resposta me ajudou! Hahahahahahha O problema é que fui ver o 'database' e não sei pq, mas estava vazio, achei que estava com código. Peguei código fornecido e também descobri que o sqllite não foi instalado, aí instalei. Enfim, tudo rodando normalmente!

Obrigado