У меня есть код в Node.js, который выбирает все из базы данных SQLite и печатает каждую строку, и он работает, вот код:
var sqlite3=require('sqlite3').verbose();
var db=new sqlite3.Database('./database.db',(err)=>{
if(err){
return console.error(err.message);
}
console.log('Connected...');
});
db.all('SELECT * FROM langs ORDER BY name',[],(err,rows)=>{
if(err){
return console.error(err.message);
}
rows.forEach((row)=>{
console.log(row.name);
});
});
db.close((err) => {
if (err) {
return console.error(err.message);
}
console.log('Database closed...');
});
Он печатает:
Connected...
C
Java
Database closed...
Но когда я пытаюсь использовать это, чтобы получить строки в массиве, он не работает:
var data=[];
db.all('SELECT * FROM langs ORDER BY name',[],(err,rows)=>{
if(err){
return console.error(err.message);
}
rows.forEach((row)=>{
data.push(row);
});
});
for(col in data){
console.log(col.name);
}
Он печатает:
Connected...
Database closed...
РЕШЕНИЕ: После изменения кода для работы с async/await
и обновления Node до версии 8.11.1 он работает, код:
var data=[],records=[];
function getRecords(){
return new Promise(resolve=>{
db.all('SELECT * FROM langs ORDER BY name',[],(err,rows)=>{
if(err){
return console.error(err.message);
}
rows.forEach((row)=>{
data.push(row);
});
resolve(data);
});
});
}
async function asyncCall(){
records=await getRecords();
records.forEach(e=>{
console.log(e.name);
});
}
asyncCall();
Это связано с тем, что db.all
является asynchronous
. Массив данных еще не заполнен, и вы пытаетесь его пропустить. Просто двигайтесь for
петлями внутри, и все готово.
Ваш последний код должен выглядеть так:
var data=[],
records = [];
function getRecords(){
return new Promise((resolve,reject)=>{
db.all('SELECT * FROM langs ORDER BY name',[],(err,rows)=>{
if(err){
return console.error(err.message);
}
rows.forEach((row)=>{
data.push(row);
});
resolve(data);
})
})
}
(async function(){
records = await getRecords();
})()
пс. Не рекомендуется использовать for(..in..)
лучше использовать forEach
async/await
чтобы получить данные и использовать их там, где вы хотите
console.log
во второй реализации. Вы хотели напечатать что-то конкретное? ... моя ошибка, я вижу это сейчас.