在下面的代码中,'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节点包。
这是因为db.serialize
and和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();
});
});
正如Antoine Chalifour指出的那样,在console.log(JSON.stringify(users));
在异步回调中被修改之前你调用users
。请参阅他的答案以获得修复和解释。
你写了if (err) { console.error(err.message); }
然后继续其余的功能。这很糟糕,因为可能会发生错误而您只是继续使用您的程序。你应该写一些类似的东西:
if (err) {
console.error(err);
return;
}
要么:
if (err) throw err;