Как мне передать обещание подключения к базе данных с обещаниями sqlite? - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я создаю бэкэнд для веб-сайта в 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. Как сделать, чтобы этот класс использовал обещания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...