node.js脚本中的Sqlite SQLITE_MISUSE错误

Mar*_*ood 4 javascript sqlite node.js

当我使用此查询启动代码时,有时我可以看到列出的所有表,有时只有一个,我总是得到这个错误:

查询错误:错误:SQLITE_MISUSE:未知错误

我已经读过,当SQLITE API使用不当时会发生SQLITE_MISUSE.你能帮助我吗,因为我在这段代码中找不到什么错误.

编辑.我已经对代码进行了更改以摆脱竞争问题.

仍然会出现带有SQLITE_MISUSE wrror的消息,但消失的表问题已经消失.在我的查询中竞争是这样的.

这是代码.

var sqlite3 = require("node-sqlite3");
var fs = require('fs');

var query_count;
var init = function (response) {
    var db = new sqlite3.Database("test.db", function() {

        fs.readFile('./assets/sql/initDB.sql', function(err,data){
            if(err) {
                console.error("Could not open file: %s", err);
                return;
            }

            var query = data.toString('utf8');
            queries = query.split(";");

            db.serialize(function() {
                query_count = queries.length;
                for(var i=0; i<queries.length; i++) {
                    queries[i] = queries[i].replace("\r\n","");
                    db.run(queries[i], function(error) {
                        if(error) {
                            console.log("Query Error: "+error);
                        }

                        query_count--;

                        if( query_count <= 0 ) {
                            db.close();
                            listAllTables(response);
                        }
                    });
                }
            });
        });
    });
};

function listAllTables(response) {
    var db = new sqlite3.Database("./assets/sql/test.db", function () {
        db.all("SELECT name FROM sqlite_master WHERE type = 'table'", function (error, records) {
            for(var record in records) {
                response.write(record+": "+records[record]+"\n");
                for(var prop in records[record]) {
                    response.write("\t"+prop+": "+records[record][prop]+"\n");
                }
            }

            response.end();
            db.close();
        });
    });
}

exports.load_customers = function(response) {
    init(response);
};
Run Code Online (Sandbox Code Playgroud)

查询文件initDB.sql是这样的:

CREATE TABLE IF NOT EXISTS TemporaryAuthTokens (
  authToken TEXT PRIMARY KEY NOT NULL UNIQUE,
  expireDate NUMERIC NOT NULL);

CREATE  TABLE IF NOT EXISTS User (
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE  ,
  login TEXT NOT NULL ,
  pass TEXT NOT NULL ,
  creationDate NUMERIC NOT NULL ,
  authToken TEXT NULL REFERENCES TemporaryAuthTokens(authToken)
  );
Run Code Online (Sandbox Code Playgroud)

ebo*_*man 5

你有一个竞争条件; 你的最后一个查询(其回调关闭连接)可能会在之前的一个查询之前完成,而且不用说,这会使早期的查询变得模糊.您需要重新编写代码,以便最后一个查询完成,而不是最后一个查询开始,关闭连接(例如,将计数器设置为查询数,并在每个查询完成时减少它.减去它的那个.零关闭连接).

您可能还想查看serialize数据库对象上可用的方法.现在你的初始化查询都是相互独立的,但如果你开始使用外键约束,如果尚未创建引用的表,你就会遇到麻烦,所以你需要强制执行的顺序.