在db.serialized()完成之前调用的sqlite3 db.close()

时间:2016-11-04 21:51:21

标签: node.js node-sqlite3

我有一个sqlite3嵌套查询案例。希望将每个查询结果推送到json数组并将其返回。 但总是得到第二次选择调用的“错误:SQLITE_MISUSE:数据库句柄已关闭”。 似乎在第二次查询之前调用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();

};

1 个答案:

答案 0 :(得分:1)

I9的回调函数中,嵌套调用db.all()Per the docsdb.each()仅序列化直接在db.serialize()回调函数中进行的调用。就db.serialize()而言,由于不再需要进行内联调用,因此db.serialize()的回调一被调用,就完成了其工作,因此执行了db.each()。 / p>

这里的解决方案-摆脱db.close(),因为您仅在其中调用db.serialize(),并对db.each()使用第二个“ completion”回调函数来调用db.each()之后db.close()遍历了所有行。

如果需要在db.each()之后进行更多的数据库调用,请在db.each()完成回调中添加db.serialize() 内部,然后从那里继续。

db.each()