sqlite3的db.close()调用之前db.serialized()完成
我有一个sqlite3的嵌套查询情况。希望每个查询结果推到一个JSON数组,然后返回。但是,总是得到“错误:SQLITE_MISUSE:数据库关闭句柄”的第2选择调用。看来db.close()第二个查询之前被调用。
这是为什么,我以为可以连载利用这一照顾。如何修复它吗?
var getMyDbInfo = function(callback) {
var db = new sqlite3.Database("MyDB.sqlite3");
db.serialize(function() {
var myJsonObj = {};
db.each("select * from Table1",
function(err, row) {
console.log("\n---- 0 ----\n");
// calculate doorId from row
doorId = ...
db.all("select * from Table2 where ID=" + doorId,
function(err, row2) {
console.log("---- 6 ----\n");
if(err) {
console.log("-- ERR: " + err);
} else {
console.log(row2);
var myJsonElem = {ID:row.ID,
DoorName: row2.DoorName,
TimeSpec: row2.TimeSpec };
myJsonObj.data.push(myJsonElem);
}
}
);
}
);
callback(null, myJsonObj);
});
console.log("---- 10 ----\n");
db.close();
};
回答如下:
该db.all()
调用嵌套在db.each()
的回调函数。 Per the docs,db.serialize()
只序列直接在db.serialize()
回调函数的调用。至于db.serialize()
而言,因为没有更多的联调用进行,所以执行db.each()
它的任务是尽快为db.close()
调用回调完成。
这里的一个解决方案 - 摆脱db.serialize()
的,因为你只里面调用db.each()
,并使用第二个“completion”回调函数db.each()
db.close()
已通过所有行运行后调用db.each()
。
如果需要让更多的DB db.each()
调用后,添加db.serialize()
的db.each()
完成回调中,并从那里继续。
var getMyDbInfo = function(callback) {
var db = new sqlite3.Database("MyDB.sqlite3");
var myJsonObj = {};
db.each("select * from Table1",
function(err, row) {
console.log("\n---- 0 ----\n");
// calculate doorId from row
doorId = ...
db.all("select * from Table2 where ID=" + doorId,
function(err, row2) {
console.log("---- 6 ----\n");
if(err) {
console.log("-- ERR: " + err);
} else {
console.log(row2);
var myJsonElem = {ID:row.ID,
DoorName: row2.DoorName,
TimeSpec: row2.TimeSpec };
myJsonObj.data.push(myJsonElem);
}
}
);
},
function (err, rows) {
callback(null, myJsonObj);
db.close();
console.log("---- 10 ----\n");
}
);
};