Вход

Просмотр полной версии : Работа с sqlite


villiwalla
12.03.2019, 13:03
Более подходящей ветки форму подобрать получилось, извиняй если что :-?
Делаю приложение на eletron. Для работы с БД выбрал sqlite. При старте приложения хочу получить список сотрудников(worker). Но получается, что мне в ответ возвращается 2 объекта. Сначала Primise и и только потом уже Object (с записью из бд).

Как мне при вызов User.getWorker() и в подобных получать сразу объект из бд а не промис и только потом уже запись бд.

Сейчас всё выглядит следующим образом:

Database.js

'use strict';

class Database {

constructor() {
this._sqlite3 = require('sqlite3').verbose();
this._conn = new this._sqlite3.Database(__dirname + '/database.sqlite');
}


findOne(sql, params) {
return new Promise((resolve, reject) => this._conn.get(sql, params, function (err, row) {
if(err) reject(err);
resolve(row)
}));
}
}


User.js
'use strict';

class User extends Database {
constructor() {
super();
}

getWorker() {
let sql = 'select u.*, w.password from users u, workers w where u.id = w.user_id and u.type_id = ?';
return super.findOne(sql, [1]);
}

}

index.js

let user = new User();
console.log(user.getWorker().then(res => { console.log(res )}));


В ответ при старте приложения получаю:
http://ipic.su/img/img7/fs/Bezimeni.1552384802.png

Хотел всегда наследоваться от Database и не писать на вызовах ребёнка .then().cath(). Пробывал так в классе Database:

_query(sql, params, action) {
return new Promise((resolve, reject) => {
this._conn[action](sql, params, function (err, data) {
if(err) reject(err);
resolve(data)
})
});
}

findOne(sql, params) {
return this._query(sql, params, 'get').then((res) => res);
}



В ответ приходит промис с содержанием ответа в [[PromiseValue]]. Но не сам объект записи из БД.
http://ipic.su/img/img7/fs/Bezimeni2.1552386495.png

Объясните что я не так делаю, что бы я мог просто использовать super.findOne(sql, params) и в ответ уже получать нормальный объект записи из бд а не промис?

SuperZen
12.03.2019, 14:57
async/await в помощь

<script>

class FakeDB {

constructor() { }

getData(data) {
return new Promise((res, rej) => setTimeout(res, 100, data))
}
}

class User extends FakeDB {

constructor() {
super()
}

getUser() {
return super.getData({ user: 'ok' })
}
}

(async function () {
let user = new User()
console.log(await user.getUser())
})()

</script>

villiwalla
12.03.2019, 15:54
async/await в помощь

<script>

class FakeDB {

constructor() { }

getData(data) {
return new Promise((res, rej) => setTimeout(res, 100, data))
}
}

class User extends FakeDB {

constructor() {
super()
}

getUser() {
return super.getData({ user: 'ok' })
}
}

(async function () {
let user = new User()
console.log(await user.getUser())
})()

</script>

Без вариантов получается, везде где дёргаю метод класса (модели) придётся такую конструкцию делать?

(async function () {
let user = new User()
console.log(await user.getUser())
})()

SuperZen
12.03.2019, 16:19
Сделай управляющий класс в нем методы async/await...

<script>
class Logic {
constructor() {

}
run(blabla) {
setInterval(this.doLogic, 100, blabla)
}
async doLogic(data) {
const res = await Promise.resolve(data)
console.log(res)
return res
}
}

const logic = new Logic()
logic.run({ do: 'it' })
</script>


или изучай javascript больше...