Невозможно поместить строки в массив, используя sqlite3 на Node.js

1

У меня есть код в 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();
  • 0
    я могу что-то упустить, но похоже, что у вас нет оператора console.log во второй реализации. Вы хотели напечатать что-то конкретное? ... моя ошибка, я вижу это сейчас.
Теги:
sqlite3
asynchronous

1 ответ

1
Лучший ответ

Это связано с тем, что 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

  • 0
    Мне нужно передать этот массив через WebSocket, так что мне нужно будет положить туда все?
  • 0
    Вы можете использовать async/await чтобы получить данные и использовать их там, где вы хотите
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню