2012-08-27 46 views
4

當我與此查詢啓動代碼,有時我可以看到所有的表中列出,有時只有一個,我總是得到這樣的錯誤:sqlite的SQLITE_MISUSE錯誤的Node.js腳本

查詢錯誤:錯誤:SQLITE_MISUSE:未知錯誤

我讀過,當SQLITE API是unproperly使用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); 
}; 

查詢文件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) 
); 
+0

我可以補充一點誤差成爲僅在初始化函數的代碼引起的(我試過init和SELECT查詢load_customers separatly)。 –

回答

5

你已經有了一個競爭條件;有可能您的最後一個查詢(其回調關閉連接)會在先前的查詢之前完成,並且不用說,將先前的查詢綁定。你需要返工您的代碼,以便於最後查詢完成,而不是最後一次查詢到開始,關閉連接(例如,設置一個計數器來查詢的數量,並有當它完成。在它的每個查詢遞減一個減少到零關閉連接)。

你也可能想看看serialize方法是可用的數據庫對象。現在你的初始化查詢都是相互獨立的,但是如果你開始使用外鍵約束,如果被引用的表還沒有被創建,你就會遇到麻煩,所以你需要強制執行的順序。

+0

感謝您的回覆。由於您的建議,我更改了數據庫關閉條件,並添加了序列化模式。 Unfortunently,仍然出現錯誤,但它是從消息「不明錯誤」微變「不出錯」: 查詢錯誤:錯誤:SQLITE_MISUSE:不是一個錯誤 –

+0

請編輯您的問題,以反映新的代碼。表格是否正確創建? – ebohlman

+0

我編輯了問題信息中的代碼。當我寫關於錯誤的信息時,我想到了SQLITE_MISUSE消息。消除bug的表已修復。 –