node-webkit中使用sqlite3(MAC平台)

时间:2021-09-30 05:28:11

前言

最近使用node-webkit开发一款博客发布软件,来替换难用的Windows Live Writer(主要是对Markdown标签的支持很差劲)。为了解决博文信息临时保存的问题,想到了使用sqlite这个小型的数据库。折腾的过程中遇到不少问题,这里做个记录方便以后查阅。

安装Sqlite3模块

参考sqlite3的官方文档说明,使用npm install sqlite3安装sqlite3。

使用node-webkit测试官方给出的一段代码:

<script type="text/javascript">
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('data.db');
db.serialize(
function() {
db.run(
"CREATE TABLE lorem (info TEXT)");

var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run(
"Ipsum " + i);
}
stmt.finalize();

db.each(
"SELECT rowid AS id, info FROM lorem", function(err, row) {
console.log(row.id
+ ": " + row.info);
});
});

db.close();
</script>

执行以上代码会报如下错误:

Uncaught Error: Cannot find module './binding/Release/node-v11-darwin-ia32/node_sqlite3.node'

这是因为我是用的node-webkit是32位的,而使用npm安装的sqlite3模块是针对node.js的64位版本,如下图所示:

node-webkit中使用sqlite3(MAC平台)

看了下sqlite3的官方文档,文档中提到,nodejs和node-webkit的ABI不同,需要针对node-webkit重新编译sqlite3。

重新编译针对node-webkit的sqlite3模块

这个过程还是参考的sqlite3的官方资料,不过过程中遇到不少问题。

这里直接给出正确的编译步骤:

1. 没有安装nw-gyp的话,全局安装之:sudo npm install nw-gyp -g (nw-gyp可以用来编译针对node-webkit的C++ add on模块,因为node-sqlite3有部分代码是用C语言编写的,所以需要针对不同平台进行单独编译)

2. cd到sqlite3的安装目录(node_modules/sqlite3),执行重新编译命令:nw-gyp rebuild --target=0.8.4 --arch=ia32 (target参数是node-webkit的版本,根据自己使用的node-webkit版本号自行修改,arch参数是node-webkit的架构信息,我用的是mac 32位的node-webkit,所以必须指定为ia32)

3. 将编译的node_sqlite3.node(在node_modules/sqlite3/build/Release目录下)放到合适的目录:node_modules/sqlite3/lib/binding/Release/node-v11-darwin-ia32 (node-v11-darwin-ia32默认是不存在的,需要手动创建)

再次测试官方给出的代码

再次执行后控制台输出结果如下(可以看到select语句的查询结果输出,表明可以正常使用了):

node-webkit中使用sqlite3(MAC平台)