【发布时间】:2018-03-28 15:20:35
【问题描述】:
package.json
{
"main": "app/app.js",
"scripts": {
"postinstall": "install-app-deps",
"start": "electron ."
},
"dependencies": {
"sqlite3": "^3.1.8"
},
"devDependencies": {
"electron-prebuilt-compile": "^1.7.9",
"electron-builder": "^19.37.2",
"electron-rebuild": "^1.6.0"
}
}
index.html
<body>
<div id="app"></div>
<div id='database'></div>
<script>
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('./test.db')
db.serialize(function () {
var stmt = db.all("select * from BK_GROUP", function (_, rows) {
console.log('end1');
})
var stmt2 = db.all("select * from BK_GROUP", function (_, rows) {
console.log('end2');
})
})
console.log('out1');
db.close();
</script>
<script src="main.js"></script>
</body>
我希望(根据sqlite3的api文档https://github.com/mapbox/node-sqlite3/wiki/Control-Flow)这段代码应该是这样输出的
end1
end2
out1
但真正的输出是
out1
end1
end2
我按照网络上的一些说明,安装 electron-rebuild,然后运行它
./node_modules/.bin/electron-rebuild
它也找到了 sqlite3 并重建它,但这没有帮助。
我还在 package.json 的脚本中添加了 postinstall。
但如果我在纯 node.js 环境中运行此代码,它会输出正确的结果。
更多,如果我在电子中运行此代码,它会正确输出(先打印结束,然后输出)。唯一的区别是这段代码在内存中打开数据库,上面打开一个位于硬盘驱动器上的文件数据库。
<body>
<h1>electron-boilerplate-sqlite</h1>
<ul id="database">
</ul>
<script>
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10000; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
var rows = document.getElementById("database");
db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
var item = document.createElement("li");
item.textContent = "" + row.id + ": " + row.info;
rows.appendChild(item);
});
console.log('end')
setTimeout(() => console.log('delay'), 1000);
});
console.log('out')
db.close();
</script>
</body>
我现在能做什么?
【问题讨论】: