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.