2

私はsqlite3のネストされたクエリケースを持っています。各クエリ結果をjson配列にプッシュして返すことを望んでいました。ただし、2 回目の選択呼び出しでは、常に「エラー: 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();

};
4

1 に答える 1

2

db.all()呼び出しは、のコールバック関数にネストさdb.each()れています。docs に従って、コールバック関数db.serialize()で直接行われた呼び出しのみをシリアル化しdb.serialize()ます。関する限りdb.serialize()、そのジョブはコールバック fordb.each()が呼び出されるとすぐに完了します。インライン呼び出しを行う必要がなくなるため、db.close()実行されます。

ここでの解決策 -内部でdb.serialize()呼び出しているだけなので削除し、すべての行を実行した後にその呼び出しに対して 2 番目の「完了」コールバック関数を使用します。db.each()db.each()db.close()db.each()

の後にさらに DB 呼び出しを行う必要がある場合は、完了コールバックdb.each()に a を追加して、そこから続行します。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");
        }
    );

};
于 2019-02-09T23:06:54.253 に答える