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 Réponses :
Essayez le package sqlite, plutôt que le sqlite3 utilisé dans la démo. Il a un meilleur support pour l'attente asynchrone.
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.
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;
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.
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 syntaxepromise
ouasync / 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é).