在下面的代码中,‘db.each’中使用的users.push
不起作用。但是,如果我将‘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();
我使用的是express和sqlite3节点包。
发布于 2019-03-12 03:50:48
这是因为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();
});
});
发布于 2019-03-12 04:01:35
第一个错误:未正确处理异步性
正如Antoine Chalifour所指出的,在异步回调中修改users
之前调用console.log(JSON.stringify(users));
。有关修复和解释,请参阅他的回答。
第二个错误:错误未处理
您编写了if (err) { console.error(err.message); }
,然后继续执行函数的其余部分。这很糟糕,因为可能会发生错误,您只需继续执行程序即可。相反,您应该编写类似这样的代码:
if (err) {
console.error(err);
return;
}
或者:
if (err) throw err;
https://stackoverflow.com/questions/55109253
复制相似问题