访问SQLite数据库的JavaScript函数
我正在使用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如何返回数组的 有没有人对如何正确填充数组有什么建议,这样我就可以遍历它们并写入页面 谢谢你的帮助访问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函数返回顶部为空的数组,但在扩展长度
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模型。我感谢你的帮助@史蒂夫更新了解决方案。我不太清楚他们是否适合你。如果您觉得有帮助,请将此标记为已回答,我们将不胜感激。谢谢你!太棒了。非常感谢。我为此挣扎了很长一段时间。我欠你的债。