что не так с положением строк в массив sqlite3 nodejs - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу сохранить значения строк sqlite3 в массив. Я следовал тому, что обсуждалось здесь:

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

Однако, когда я console.log, мой потенциальный массив records, я получаю:

console.log(records) => массив со значениями [1,1,2]

console.log(records[1]) => undefined

Должна быть ошибка в моем понимании того, что происходит. Что не так?

Полный код ниже:

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('src/db/ksbib.db', (err) => { if (err) { return console.log(err.message); } });
let result = []; 
let records = [];

function catchResult (err, row)
{
  if (err) { return console.log(err.message); } 
  else { return result.push(row.objektid); }
}

function getData () 
{
  return new Promise ((resolve, reject) => 
  {
    db.parallelize ( () =>
    { 
      db.each(sqlTitel(param), catchResult);
      db.each(sqlAutor(param), catchResult);
    });
    resolve(result);
  })
}

async function res () 
{
  records = await getData();
  console.log(records);
  console.log(records[1]);
  return records;
};

let x = res();
console.log(x);

1 Ответ

0 голосов
/ 09 марта 2020

Противоречие между console.log (records) и console.log (records [1]) не существует в командной строке. Кажется, что какой-то другой код мешает работе консоли.

Более того, обещание, реализованное выше, разрешается с массивом результатов emtpy до того, как запрос к базе данных будет завершен. Можно ввести тайм-аут для игры с кодом.

Чтобы разрешить обещание после запроса к базе данных, необходимо разрешить его в функции обратного вызова запроса. Это также причина, по которой db.all гораздо проще обрабатывать, чем db.each.

Вместо серии запросов к базе данных можно использовать серию обещаний. Таким образом, важно дождаться разрешения каждого отдельного обещания (простое их соединение return await sqr(sqlTitle(y), []).then(sqr(sqlAuthor(y), [])) не дает уникального результата). Массив результатов заполняется по крупицам.

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('ksbib.db', (err) => { if (err) { return console.log(err.message); } });
let result = []; 
let p;
function sqr (sql, x)
{
    return new Promise(function (resolve, reject) 
    {
        db.all(sql, x, (err, rows) => 
        {
            if (err) { 
                reject(err); 
            } else {
                rows.forEach( (row) => {result.push(row.objektid)} );
                resolve(result);
            }
        });
    });  
}

( async () =>
{
    p = await sqr(sqlTitle(y), []);
    p = await sqr(sqlAuthor(y), []);
    return p;         //the final result
})();  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...