使用push将JS对象插入数组不会在某些上下文中工作

问题描述 投票:0回答:2

在下面的代码中,'db.each'中使用的users.push不起作用。但是,如果我将'users.push'移到外面,那么它似乎有效。

如何将新对象从db.each推送到users数组?

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

我正在使用express和sqlite3节点包。

javascript arrays node.js object array-push
2个回答
2
投票

这是因为db.serializeand和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(); 

      });
    });

1
投票

First error: asynchronicity not handled properly

正如Antoine Chalifour指出的那样,在console.log(JSON.stringify(users));在异步回调中被修改之前你调用users。请参阅他的答案以获得修复和解释。

Second error: errors not handled

你写了if (err) { console.error(err.message); }然后继续其余的功能。这很糟糕,因为可能会发生错误而您只是继续使用您的程序。你应该写一些类似的东西:

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

要么:

if (err) throw err;
© www.soinside.com 2019 - 2024. All rights reserved.