Невозможно поместить строки в массив, используя sqlite3 на Node.js - PullRequest
0 голосов
/ 04 мая 2018

У меня есть код в 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 и обновления узла до версии 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();

1 Ответ

0 голосов
/ 04 мая 2018

Это потому, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...