2
votes

Async attend sqlite en javascript

Je regarde ce tutoriel , qui contient un bibliothèque appelée aa-sqlite afin de remplacer la syntaxe Promises () par async-await.

Je suis ne voit pas aa-sqlite sur npm. Existe-t-il une autre syntaxe mise à jour pour async await sqlite?

Voici ce que j'essaye avec la bibliothèque sqlite standard:

TypeError: res1 is not iterable

Mais cela donne

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database("tmp.db")

async function myfunc(db) {
  let sql = "SELECT id id FROM TABLE LIMIT 2"
  let res1 = await db.run(sql)
  console.log(res1)
  for (row of res1) {
    console.log(row);   
  }

Je ne m'attends pas à ce que res1 soit un objet, mais plutôt un itérateur de résultats. Comment puis-je asynchroniser / attendre les résultats d'une requête db.run dans ES7 / ES8?


4 commentaires

que consigne console.log (res1) ?


Base de données {open: true, nom de fichier: 'tmp.db', mode: 65542}


@Mittenchops Vous ne pouvez pas utiliser for ..of avec des objets. Voir developer.mozilla.org/en -US / docs / Web / JavaScript / Référence /…


Je pense que votre package - sqlite3 ne prend pas en charge la syntaxe promise ou async / await . Dans ES6, vous pouvez encapsuler les fonctions basées sur le rappel avec Promise, qui sont essentiellement une valeur de retour avec état (en attente, résolu, rejeté).


4 Réponses :


3
votes

Essayez le package sqlite, plutôt que le sqlite3 utilisé dans la démo. Il a un meilleur support pour l'attente asynchrone.


0 commentaires

1
votes

Vous remarquez que vous voyez le package aa-sqlite car ce n'est pas un package npm.

Le type qui a écrit le tutoriel auquel vous faites référence a simplement expliqué comment il a créé ce petit paquet aa-sqlite, et tout est écrit dans le tuto, mais il n'a pas été publié sur npm.


0 commentaires

4
votes

J'ai en quelque sorte essayé le package sqlite npm, qui implémente async / await sur splite3, mais ce n'est pas si simple à utiliser.

Un moyen simple est de créer un petit module et de promessifier les fonctions principales de sqlite3. p >

Voici mon module simple que j'ai créé pour une base de données de chatbot Discord:

const db = require('./db');

// get one user
const myUser = await db.get("select * from users where id = ?", [id]);
if (! myUser)
    return console.log("User with id", id, "not found");

// get all users
const users = await db.all("select * from users");
users.map((user) => { console.log(user.id, "/", user.name); });

// ... etc ...

Comment utiliser - maintenant vous pouvez utiliser le module comme celui-ci dans votre code: p>

const sqlite3 = require('sqlite3');
const util    = require('util');

let db = new sqlite3.Database('./db/chatbot.sqlite3', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Connected to the chatbot database.');
});

db.run = util.promisify(db.run);
db.get = util.promisify(db.get);
db.all = util.promisify(db.all);

// empty all data from db
db.clean_db = async function() {
  await db.run("delete from users");
  await db.run("delete from members");
  await db.run("delete from guilds");
  db.run("vacuum");
}

// any kind of other function ...

// and then export your module

module.exports = db;


0 commentaires

1
votes

Pour moi, la solution la plus simple serait d'encapsuler l'opération dans une promesse comme ceci:

const res = await new Promise((resolve, reject) => {
    db.each('SELECT id FROM table', [], (err, row) => {
        if (err)
            reject(err)

        resolve(row)
    })
})

console.log(res)

Avec cela, vous aurez le résultat row dans res en dehors du rappel et de manière synchrone.


0 commentaires