【问题标题】:JavaScript functions accessing SQLite db访问 SQLite 数据库的 JavaScript 函数
【发布时间】:2017-01-02 12:26:53
【问题描述】:

我正在使用带有 JavaScript 的 Electron 并尝试访问 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]);
    }
};

【问题讨论】:

    标签: javascript arrays function sqlite electron


    【解决方案1】:

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

    选项 1 的代码中发生的情况是,它将调用 db.all 函数,并且由于它是异步的,因此它将转到下一行 - 即您的 console.log,最后是 return larray,这将为空。

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

    示例:

    数据.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() 期望从Location() 返回一些东西,但从你的代码中它目前没有返回任何东西,但我怀疑它可能只是你试图调试东西。无论如何,这超出了问题范围,所以我不会在这里太担心。

    【讨论】:

    • 谢谢,塞缪尔。这是进步,但我仍然有一个错误。当我实现上述内容时,我从 model.js 中得到“TypeError: Cannot read property 'length' of undefined”。它会向我暗示长度仍然是 0,是吗?至于 viewLocation(),我为 Location() 粘贴了错误的代码。原始消息已更正为我实际拥有的消息。为了进行测试,我使用了您在 Locations() 中提供的代码,并从页面按钮中调用了该代码。但是,对于我刚才提到的错误以及如何使用上面更正的代码整体实现的想法,我们将不胜感激。
    • @Steve - 这是我的错误。我们传递给getLocations 的回调函数缺少一个参数。我们通过回调值做了正确的事情,但我们忘记在另一端检索它。我已经更新了解决方案。试一试
    • 好的!所以,它的效果非常好。太感谢了!但是,如果我可能会问,我将如何在上面进一步编辑的 model.js 和 view.js 之间分离代码来实现这一点?我当然可以将两者合二为一,就像您已经成功完成的那样,但我正在尝试维护 MVC 模型。感谢您的帮助!
    • @Steve 更新了解决方案。我不太确定它们是否适合你。如果您觉得它有帮助,您可以将其标记为已回答,我们将不胜感激。谢谢
    • 太棒了!绝对精彩。谢谢你。我为此苦苦挣扎了一段时间。我欠你的债。
    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2016-12-10
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多