JavaScript函数访问SQLite db

时间:2016-08-25 22:59:45

标签: javascript arrays function sqlite electron

我正在使用Electron with JavaScript并尝试访问SQLite数据库。 db的输出是国家/地区列表。目标是div中的简单ul。该操作由附加到页面上按钮的onclick事件调用。

这是问题所在。从技术上讲,我可以访问数据库。但是,在数据层(data.js)中,我有两个选项,只能从db文件填充数组。在每个中找到的console.log()仅用于调试。

在选项1中,return元素返回完全填充长度为23的数组(参见下面的选项1图像),而将返回元素移出db.all函数会使数组返回顶部空,但在展开时填充长度为0(参见选项2图像)。我认为第一个选项是数组的外观,但由于数组包含在db.all函数中,因此它不会为data.js中的getLocations()返回任何内容。随后,model.js和view.js(下面的代码)中的数组仍未定义。

如果我使用选项2,则数组会填充该行(即数据,模型和视图),但所有数组的长度保持为0,因为它们“在顶部为空”。因此,迭代遍历数组以写入div失败,因为长度最终在0处不正确。

作为旁注,如果我在data.js中将国家/地区硬编码到数组中,一切正常,国家/地区列表会写入页面。虽然我可以(并且需要)从db文件中获取数据,但它似乎会导致上述问题。所以,它实际上是关于data.js如何返回数组的。

有没有人对如何正确填充数组有任何建议,以便我可以遍历它们并写入页面?

感谢您的帮助!!

Data.js选项1:

function getLocations() {
    var sqlite3 = require('sqlite3').verbose();
    var file = 'db/locations.sqlite3';
    var db = new sqlite3.Database(file);
    var larray = [];

    db.all('SELECT * FROM Country', function(err, rows) {
        rows.forEach(function(row) {
            larray.push(row.CountryName);
        })
    console.log(larray);
    return larray;
    });
}

Data.js选项2:

function getLocations() {
    var sqlite3 = require('sqlite3').verbose();
    var file = 'db/locations.sqlite3';
    var db = new sqlite3.Database(file);
    var larray = [];

    db.all('SELECT * FROM Country', function(err, rows) {
        rows.forEach(function(row) {
            larray.push(row.CountryName);
        })
    });
    console.log(larray);
    return larray;  
}

选项1图片: enter image description here

选项2图片: enter image description here

model.js:

function Locations() {

    //Pull location values from data
    var viewLoc =  getLocations();

    return viewLoc;
}

view.js:

function viewLocation() {

    var viewLoc = Locations();

    var container = document.getElementById('wrapper');

    for (var i=0; i < viewLoc.length; i++) {  
      container.insertAdjacentHTML('beforeend', '<li>' + viewLoc[i]);
    }
};

1 个答案:

答案 0 :(得分:1)

db.all是一个异步函数。在从数据库收到响应之前,它的回调函数不会立即执行。

选项1的代码中发生了什么,它将调用db.all函数,因为它是异步的,它将继续移动到下一行 - 即console.log,最后{ {1}}这将是空的。

解决问题;您需要将return larray作为参数接受回调函数。然后,当收到getLocations()的回复时,填充db.all并通过回调返回。

示例:

data.js

larray

model.js

function getLocations(done) {
    var sqlite3 = require('sqlite3').verbose();
    var file = 'db/locations.sqlite3';
    var db = new sqlite3.Database(file);
    var larray = [];

    db.all('SELECT * FROM Country', function(err, rows) {
        // This code only gets called when the database returns with a response.
        rows.forEach(function(row) {
            larray.push(row.CountryName);
        })
        return done(larray);
    });
}

view.js

function Locations(done) {
    return getLocations(done);
}

BTW再次查看你的代码。似乎function viewLocation() { // Pull location values from data var viewLoc = Locations(function(/*OOPS, THIS WAS MISSING!!=*/results) { // Code only gets triggered when getLocation() calls return done(...); var container = document.getElementById('wrapper'); for (var i=0; i < results.length; i++) { container.insertAdjacentHTML('beforeend', '<li>' + results[i]); } }); } 期望从viewLocation()返回一些东西但是从你的代码中它现在没有返回任何东西,但我怀疑它可能只是你试图调试的东西。无论如何,这不属于问题范围,所以我不会在这里太关注。