В настоящее время я создаю бэкэнд для веб-сайта в node.js с использованием sqlite3 (на основе обратного вызова). В частности, я строю аутентификацию. Моя проблема в том, что я следую руководству, которое не использует обещания для соединений с базой данных и использует синхронную версию bcrypt. В руководстве, которому я следую, есть класс, который абстрагирует базу данных, например,
class Db {
constructor(file) {
this.db = new sqlite3.Database(file);
this.createTable()
}
createTable() {
const sql = `
CREATE TABLE IF NOT EXISTS user (
id integer PRIMARY KEY,
name text,
email text UNIQUE,
user_pass text,
is_admin integer)`
return this.db.run(sql);
}
selectByEmail(email, callback) {
return this.db.get(
`SELECT * FROM user WHERE email = ?`,
[email],function(err,row){
callback(err,row)
})
}; module.exports = Db;
Я хотел бы использовать библиотеку https://github.com/kriasoft/node-sqlite, которая является многообещающей версией библиотеки sqlite3. Однако в этой библиотеке sql.open("database.file", {Promise})
возвращает обещание.
Предполагаемое использование класса Db может быть (где db является экземпляром Db)
router.post('/register', function(req, res) {
db.insert([
req.body.name,
req.body.email,
bcrypt.hashSync(req.body.password, 8)
], function (err) {
if (err) return res.status(500).send("There was a problem registering the user.")
db.selectByEmail(req.body.email, (err,user) => {
if (err) return res.status(500).send("There was a problem getting user")
res.status(200).send({ auth: true, user: user });
});
});
Однако, если бы я использовал здесь обещания, я не знаю, как передать объект базы данных как this.db
, потому что sql.open
возвращает обещание. Могу ли я просто передать это обещание, например, createTable
, и новый код для каждой функции будет выглядеть примерно так: this.db.then((db)=> db.run(sql))
, и я могу сделать это для нескольких функций, таких как this.db.then((db)=>db.run(otherQuery))
в selectByEmail
. Как сделать, чтобы этот класс использовал обещания?