node.js脚本中出现Sqlite Sqlite_MISUSE错误
Sqlite SQLITE_MISUSE error in node.js script
当我用这个查询启动代码时,有时我可以看到列出的所有表,有时只有一个,并且我总是得到这个错误:
查询错误:错误:SQLITE_MISUSE:未知错误
我读到当SQLITE API使用不当时,会发生SQLITE_MISUSE。你能帮我吗,因为我找不出这段代码有什么错。
编辑。我已经对代码进行了更改,以消除种族问题。
带有SQLITE_MISUSE错误的消息仍然会出现,但是消失表问题已经消失。在我的询问中,种族就是这样。
这是代码。
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)
);
您有一个竞赛条件;您的最后一个查询(其回调关闭了连接)可能会在前面的一个查询之前完成,不用说,这会影响前面的查询。您需要重新编写代码,以便最后一个查询结束,而不是最后一个开始的查询关闭连接(例如,为查询数设置一个计数器,并让每个查询在结束时递减。递减为零的查询将关闭连接)。
您可能还想查看数据库对象上可用的serialize
方法。现在,您的初始化查询都是相互独立的,但如果您开始使用外键约束,如果引用的表还没有创建,则会遇到问题,因此您需要强制执行顺序。
使用承诺
在这里,我从一个表中获取数据,并使用这些数据创建一个语句,以便插入另一个表。
serialize()
确实运行1乘1,但我希望在另一个查询中使用来自一个查询的响应。如果我把2nd
查询放在1st
的回调中,那么它会给出SQLITE_MISUSE
错误
db.serialize(()=>{
// QUERY 1 (SELECT) - Get data
let promiseGetFoo = new Promise((resolve, reject) => {
db.all("SELECT * FROM foo", (err, rows) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(rows);
}
});
});
// QUERY 2 (INSERT) - Use data from QUERY 1
promiseGetFoo.then((res) => {
let stmt = (res) => {
// code to create INSERT statement
}
db.run(stmt, (err) => {
if(err) console.log(err);
else console.log(">>> Insert DONE");
closeDb();
});
});
});
let closeDb = () => {
db.close() ;
}
相关文章:
- PHP:显示sqlite数据库中的html格式数据,使用tinymce保存
- 是否可以使用NativeScript使用Sqlite数据库
- SQLite插件适用于Mac和Windows,但不适用于手机上的Safari
- sqlite查询返回错误-can'我不知道为什么
- 使用Javascript将多条记录插入SQLite数据库时出错
- 连接SQlite数据库
- 如何用javascript,phonegap(cordova)将json对象插入sqlite表中
- 以html形式显示sqlite数据库中的数据(phonegap)
- node.js脚本中出现Sqlite Sqlite_MISUSE错误
- 将数据插入android中的SQLite存储时出现异常
- 如何使用PhoneGap在Sqlite中存储当前日期和时间
- 将json数据存储在sqlite(phonegap应用程序)中
- 使用JavaScript检查用户名是否已存在于SQLite中
- 如何访问Chrome创建的SQLITE数据库
- Cordova SQLite插件仅在第一次调用时有效
- PhoneGapBuild - 下载 sqlite db 并连接到它
- 通过 Javascript 访问 SQLite 数据
- 我想在混合移动应用程序中使用Sqlite插件(Cordova)创建一个示例项目
- JayData 提供程序无法为 sqLite 和 indexedDB 加载
- 从 JavaScript 对本地 SQLite 文件运行查询