Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Por favor, me tirem das trevas!

Boa noite! Estou estudando esse curso e reescrevendo algumas partes do código. Refatorei tudo para o inglês mas estou tendo problemas no momento de inserção de um novo livro na tabela.

Ao preencher os campos e tentar salvar, o fluxo da minha aplicação cai no Reject da minha Promise de adição.

Testando sem o método adiciona, digo, apenas printando os dados da requisição com o console.log, as informações vêm corretamente. Usando o método adiciona, tenho um erro.

-- CÓDIGO BOOK-DAO.JS

class BookDao {

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

    list() {
        return new Promise((resolve, reject) => {
            // sqlite method to SELECT on database
            this._db.all(
                'SELECT * FROM BOOKS', 
                (error, results) => {
                    if (error) return reject('Error trying to connect to database.');

                    return resolve(results);
                }
            )

        })
    }

    add(book) {
        return new Promise((resolve, reject) => {
            // sqlite method to INSERT on database
            this._db.run(
                `
                INSERT INTO BOOKS (TITLE, PRICE, DESCRIPTION) VALUES (?,?,?)
                `,
                [
                    book.TITLE,
                    book.PRICE,
                    book.DESCRIPTION
                ],
                (error) => {
                    if (error) {
                        console.error(error);
                        return reject ('Error trying to insert new book.');
                    }

                    resolve();
                }
            )
        })
    }
}

module.exports = BookDao;

-- CÓDIGO DATABASE.JS --

const sqlite3 = require('sqlite3').verbose();
const bd = new sqlite3.Database('data.db');

const USERS_SCHEMA = 
`
CREATE TABLE IF NOT EXISTS USERS (
    ID INTEGER PRIMARY KEY AUTOINCREMENT, 
    NAME VARCHAR(40) NOT NULL UNIQUE, 
    EMAIL VARCHAR(255) NOT NULL, 
    PASSWORD VARCHAR(255) NOT NULL
)
`;

const INSERT_USER_1 = 
`
INSERT INTO USERS (
    NAME, 
    EMAIL,
    PASSWORD
) SELECT 'Bruno Rezende', 'brunoc.rez@gmail.com', '123' WHERE NOT EXISTS (SELECT * FROM USERS WHERE email = 'brunoc.rez@gmail.com')
`;

const BOOKS_SCHEMA = 
`
CREATE TABLE IF NOT EXISTS BOOKS (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    TITLE TEXT NOT NULL, 
    PRICE REAL NOT NULL,
    DESCRIPTION TEXT DEFAULT ('') NOT NULL
)
`;

const INSERT_BOOK_1 = 
`
INSERT INTO BOOKS (
    TITLE,
    PRICE,
    DESCRIPTION
) SELECT 'Elementary NodeJS', 30.0, 'How to develop using NodeJS' WHERE NOT EXISTS (SELECT * FROM BOOKS WHERE TITLE = 'Elementary NodeJS')
`;

const INSERT_BOOK_2 = 
`
INSERT INTO BOOKS (
    TITLE,
    PRICE,
    DESCRIPTION
) SELECT 'JavaScript, Practical Application', 40.0, 'Improving your knowledge on JS' WHERE NOT EXISTS (SELECT * FROM BOOKS WHERE TITLE = 'JavaScript, Practical Application')
`;

bd.serialize(() => {
    bd.run("PRAGMA foreign_keys=ON");
    bd.run(USERS_SCHEMA);
    bd.run(INSERT_USER_1);
    bd.run(BOOKS_SCHEMA);
    bd.run(INSERT_BOOK_1);
    bd.run(INSERT_BOOK_2);

    bd.each("SELECT * FROM USERS", (err, user) => {
        console.log('User: ');
        console.log(user);
    });
});

process.on('SIGINT', () =>
    bd.close(() => {
        console.log('BD closed!');
        process.exit(0);
    })
);

module.exports = bd;

-- TRECHO CÓDIGO DO ROUTING.JS --

    app.post('/books', (request, response) => {        

        const livroDao = new LivroDao(db);
        livroDao.add(request.body)                
                .then(response.redirect('/books'))
                .catch(error => console.error(error));

    });

-- ERRO OBTIDO --

{ [Error: SQLITE_CONSTRAINT: NOT NULL constraint failed: BOOKS.TITLE] errno: 19, code: 'SQLITE_CONSTRAINT' }
Error trying to insert new book.
1 resposta
solução!

Resolvido, galera!

A única coisa que fiz de diferente foi colocar essa parte do código toda em minúsculo.

add(book) {
        return new Promise((resolve, reject) => {
            // sqlite method to INSERT on database
            this._db.run(
                'INSERT INTO BOOKS (TITLE, PRICE, DESCRIPTION) VALUES (?,?,?)',
                [
                    book.title, //aqui
                    book.price, //aqui
                    book.description //aqui
                ],
                (error) => {
                    if (error) {
                        console.error(error);
                        return reject ('Error trying to insert new book.');
                    }

                    resolve();
                }
            )
        })
    }