Dans le code ci-dessous, users.push utilisé dans 'db.each' ne fonctionnera pas. Cependant, si je déplace "users.push" à l'extérieur, cela semble fonctionner.

Comment puis-je pousser les nouveaux objets de db.each dans le tableau des utilisateurs ?

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

var users = [];

db.serialize(() => {
  db.each(`SELECT email, name FROM users`, (err, row) => {
    if (err) console.error(err.message);
    let user = {
      email: row.email,
      name: row.name
    }
    users.push(user);
  });
});

console.log(JSON.stringify(users));
db.close();

J'utilise des packages de nœuds express et sqlite3.

0
esafwan 11 mars 2019 à 22:45

2 réponses

Meilleure réponse

C'est parce que db.serialize et db.each sont des fonctions asynchrones (et retournent immédiatement, exécutant ainsi console.log avant que les rappels db ne soient exécutés).

Voici un exemple de travail :

db.serialize(() => {
      db.each(`SELECT email,
                      name
               FROM users`, (err, row) => {
        if (err) {
          console.error(err.message);
        }

        let user = {
            email : row.email,
            name : row.name
        }

        users.push(user);

        console.log(JSON.stringify(users));

        db.close(); 

      });
    });
2
antoinechalifour 11 mars 2019 à 20:38

Première erreur : asynchronisme mal géré

Comme l'a souligné Antoine Chalifour, vous appelez console.log(JSON.stringify(users)); avant que users ne soit modifié dans le rappel asynchrone. Reportez-vous à sa réponse pour obtenir des correctifs et des explications.

Deuxième erreur : erreurs non gérées

Vous avez écrit if (err) { console.error(err.message); } puis passez au reste de la fonction. C'est mauvais, car une erreur peut se produire et vous continuez simplement avec votre programme. Vous devriez plutôt écrire quelque chose comme :

if (err) {
  console.error(err);
  return;
}

Ou:

if (err) throw err;
1
Nino Filiu 11 mars 2019 à 20:01