Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问SQLite数据库的JavaScript函数_Javascript_Arrays_Function_Sqlite_Electron - Fatal编程技术网

访问SQLite数据库的JavaScript函数

访问SQLite数据库的JavaScript函数,javascript,arrays,function,sqlite,electron,Javascript,Arrays,Function,Sqlite,Electron,我正在使用Electron和JavaScript,并试图访问SQLite数据库。db的输出是国家列表。目标是div中的一个简单ul。该操作由附在页面按钮上的onclick事件调用 问题就在这里。从技术上讲,我可以访问数据库。但是,在数据层(data.js)中,我有两个选项,它们只能从db文件填充数组。在每个控制台中找到的console.log()仅用于调试 在选项1中,返回元素返回完全填充长度为23的数组(请参见下面的选项1图像),而将返回元素移出db。all函数返回顶部为空的数组,但在扩展长度

我正在使用Electron和JavaScript,并试图访问SQLite数据库。db的输出是国家列表。目标是div中的一个简单ul。该操作由附在页面按钮上的onclick事件调用

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

在选项1中,返回元素返回完全填充长度为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图像:

选项2图像:

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]);
    }
};
函数viewLocation(){
var viewLoc=位置();
var container=document.getElementById('wrapper');
对于(var i=0;i'+viewLoc[i]);
}
};

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

选项1的代码中发生的情况是,它将调用
db.all
函数,并且由于它是异步的,它将转到下一行,即
控制台.log
,最后
返回将为空的larray

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

示例:

data.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);
    });
}
model.js

function Locations(done) {
    return getLocations(done);
}
view.js

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(){
//从数据中提取位置值
var viewLoc=Locations(函数(/*OOPS,缺少!!=*/results){
//仅当getLocation()调用return done(…)时才会触发代码;
var container=document.getElementById('wrapper');
对于(var i=0;i'+结果[i]);
}
});
}

顺便说一句,再次查看您的代码。似乎
viewLocation()
希望从
Location()
返回一些东西,但从您的代码中,它目前没有返回任何东西,但我怀疑可能只是您试图调试东西。无论如何,这超出了问题的范围,所以我在这里不会太担心。

谢谢,塞缪尔。这是进步,但我仍然有一个错误。当我实现上述功能时,我从model.js中得到了“TypeError:cannotreadproperty'length'of undefined”。这会告诉我长度仍然是0,是吗?至于viewLocation(),我为Location()粘贴了错误的代码。原始信息已更正为我实际拥有的信息。为了进行测试,我使用了您在Locations()中提供的代码,并从page按钮调用了该代码。但是,对于我刚才提到的错误以及如何用上面更正的代码整体实现,我将不胜感激。@Steve-这是我的错误。我们传递给
getLocations
的回调函数缺少一个参数。我们做了正确的事情,调用了值,但是我们忘记了在另一端检索它。我已经更新了解决方案。试试看!所以,它工作得非常好。非常感谢你!然而,如果我可以问,当我在上面进一步编辑时,我将如何使用model.js和view.js之间分离的代码来实现这一点?我当然可以像您已经成功地完成的那样将两者结合为一,但我正在尝试维护MVC模型。我感谢你的帮助@史蒂夫更新了解决方案。我不太清楚他们是否适合你。如果您觉得有帮助,请将此标记为已回答,我们将不胜感激。谢谢你!太棒了。非常感谢。我为此挣扎了很长一段时间。我欠你的债。