Вопрос:

Использование push для вставки объекта JS в массив не будет работать в определенном контексте

javascript arrays node.js object array-push

20 просмотра

1 ответ

6184 Репутация автора

В приведенном ниже коде, users.pushиспользуемом в db.each, работать не будет. Однако, если я перевожу 'users.push' наружу, то это, похоже, сработает.

Как я могу вставить новые объекты из db.each в массив пользователей?

    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(); 

Я использую экспресс-пакеты и пакеты узлов sqlite3.

Автор: esafwan Источник Размещён: 11.03.2019 07:45

Ответы (1)


1 плюс

126 Репутация автора

Это потому, что db.serializeи db.eachявляются асинхронными функциями (и, следовательно, возвращаются немедленно, поэтому они выполняются console.logдо выполнения dbобратных вызовов).

Вот должен быть рабочий пример:

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(); 

      });
    });
Автор: antoinechalifour Размещён: 11.03.2019 07:50
Вопросы из категории :
32x32