Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLite3包的Node.js脚本中的查询顺序错误_Node.js_Sqlite_Package - Fatal编程技术网

使用SQLite3包的Node.js脚本中的查询顺序错误

使用SQLite3包的Node.js脚本中的查询顺序错误,node.js,sqlite,package,Node.js,Sqlite,Package,我在玩游戏,遇到了一个奇怪的情况。 这个简单的脚本有一个简单的逻辑:查找表是否存在,是否清空,如果不存在-创建它 var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database('guy.sqlite'); //':memory:' var tableExists = false; db.serialize(function() { db.get("SELECT name FROM sqlite_

我在玩游戏,遇到了一个奇怪的情况。 这个简单的脚本有一个简单的逻辑:查找表是否存在,是否清空,如果不存在-创建它

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('guy.sqlite');    //':memory:'

var tableExists = false;
db.serialize(function() {
    db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='lorem'", function(error, row) {
        tableExists = (row != undefined);
        console.log("xxxxx " +tableExists);
    });

    console.log("yyyyy " +tableExists);

    if (tableExists) {
        console.log("table exists. cleaning existing records");
        db.run("DELETE FROM lorem", function(error) {
            if (error)
                console.log(error);
        });
    }
    else {
        console.log("creating table")
        db.run("CREATE TABLE lorem (info TEXT)", function(error) {
            if (error.message.indexOf("already exists") != -1) {
                console.log(error);
            }
        });
    }
});

db.close();
但我得到的结果是:

yyyyy false
creating table
xxxxx true
{ stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'SQLITE_ERROR: table lorem already exists',
  errno: 1,
  code: 'SQLITE_ERROR' }
根据,这些查询应该按顺序运行。但显然,
tableExists
(标记为'yyy')的计算发生在设置值(标记为'xxx')之前,导致尝试重新创建现有表。
我可以处理这个错误,但我想知道是什么导致了这个错误,以及如何在将来避免这种行为

一如既往,谢谢你抽出时间


Guy

node.js在异步模式下工作,但您的代码是某种混合了同步和异步形式的奇怪形式

select之后的完整代码应该在回调中,而您的实际代码不符合您的要求,tableexists将不具有您喜欢的值


学习node.js的异步模型;)

文档中的示例2直接解释了您的问题。tableExists变量在第一次运行时将为false,而SELECT函数仅在事件循环上排队,并且在serialize()中的代码完成之前不会运行。解决方案是将
if(tableExists)
code放在回调中进行选择。这违背了使用serialize的目的,但它就是这样工作的。写入值很好,因为它们将按照调用顺序排队,但是需要通过I/O响应的东西将需要回调,从而异步运行


另外,
SQLITE\u误用
错误源于在脚本末尾调用db.close(),但在异步回调之外。即使是在剧本的结尾,在当前函数完成后,才会调用的队列中放入的任何异步内容。

为什么删除/创建表的代码不在检查表是否存在的回调中?尝试了该操作后,出现以下错误:“SQLITE\u误用:数据库句柄已关闭”将条件移动到SELECT中函数并注释了db.close()-现在它可以工作了。但是,如果我真的需要db.close()语句,我应该把它放在哪里,以便它能够按照所需的顺序执行呢?在.serialize()函数中进行了尝试,并得到了误用错误。基本上,在所有异步命令完成之后。但是,如果您需要脚本做的不仅仅是一个简单的
创建表
,那么这就是困难的部分。首先,理解异步编程和连续性是一个学习过程,也是新手经常遇到的问题之一。有很多库试图简化这个过程。看看一本好书就是