gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:13 24 4
gpt4 key购买 nike

我正在玩 node-sqlite3 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_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' }

根据serialize command documentation ,这些查询应该按顺序运行。但显然,tableExists(标记为“yyy”)的评估发生在设置值(标记为“xxx”)之前,导致尝试重新创建现有表。
我可以处理该错误,但我想知道是什么原因造成的以及如何避免将来出现此类行为。

一如既往,感谢您抽出时间。

盖伊

最佳答案

node.js 以异步模式工作,但您的代码是混契约(Contract)步和异步形式的某种奇怪的形式。

选择后的完整代码应该在回调中,而您的实际代码没有执行您想要的操作,tableexists将不会具有您喜欢的值。

学习热爱 Node.js 的异步模型;)

关于node.js - 使用 SQLite3 包的 Node.js 脚本中的查询顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6868063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com