Nodejs node-sqlite3运行callback不起作用

我正在尝试使用nodejsnode-sqlite3包在sqlite数据库中删除一行。

当我运行删除命令,并手动检查条目,我可以看到查询成功删除该行,但我似乎无法编写确认这一点的代码。

这是查询

 db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) { console.log(error); }); 

无论是错误还是正确的input,它都会向控制台输出null 。 如果给出了正确的细节,则删除它并打印出null,如果给出了错误的id和用户,它仍然打印出null。

任何想法可能是错的?

谢谢

node和sqlite3的行为在这里没有错。 这里有两个部分首先解释一下关于Sqlite的节点和其他。

Node

执行语句后,您的callback被调用。 所以这里没什么错,因为你的callback被调用(由'null'作为输出certificate)。

Sqlite

如果在where子句中给出的条件计算结果为true,则删除Sqlite中的查询将被删除,否则不会被删除。

从node-sqlite3文档的Database#运行api :

callback(可选):如果给定,则在语句准备或执行的任何步骤期间以及运行查询之后发生错误时将调用它。 如果发生错误,则第一个(也是唯一的)参数将是包含错误消息的错误对象。 如果执行成功,则第一个参数为null。

所以,在你的情况下,查询执行成功,没有任何错误,导致callback函数的error参数为null就像你在输出中看到的一样。

此外,如果您想检查是否有任何行被实际删除,您可以使用文档中提到的changes属性:

如果执行成功,它将包含两个名为“lastID”和“changes”的属性,分别包含最后插入的行ID的值和受该查询影响的行数。 请注意,当查询是一个成功完成的INSERT语句时,“lastID”仅包含有效信息,而当查询是成功完成的UPDATE或DELETE语句时,“更改”仅包含有效信息。 在所有其他情况下,这些属性的内容是不准确的,不应该使用。 .run()函数是设置这两个值的唯一查询方法; 所有其他查询方法(如.all()或.get())都不会检索这些值。

希望能帮助到你…

我有类似的问题,callback只是不会开火。 期。 问题是我在其他地方调用process.exit(1),所以我的代码退出之前,callback有机会返回。

searchprocess.exit,这可能(或可能不会)节省您的时间debugging和责备sqlite 🙂

关于这个话题:我想到的是为什么他们在lastID中全部使用ID。 它不像SQL或USA这样的缩写。 它代表“识别”,这是一个词。

我有一些问题与nodejs 4.3和sqlite3:3.1.1。

问题是,我想单独更新时有一个行更新没​​有任何行的影响(没有做select第一)。

在我的例子中,我有一个id = 1的行。我想知道,当我做一个id = 1111更新,没有行受到影响。

我已经使用了database.run的callback,但它似乎没有价值this.changes更新时在数据库中的行执行更新。

 var sql = 'update recipes set stars = stars + 1 where id = ?'; db.run(sql, [ 1 // id = 1 execute update - if id = 11111 do nothing ], (err) => { if(err) throw err; console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); if(this.changes == 1) console.log("WORK DONE"); else console.log("NOTHING DONE"); }); 

即使更新正确执行(即使用id,例如1111111,不在db中),this.changes也是未定义的。

有一个错误,或者我不明白如何使用callback?

在控制台上的结果是:VALUE CHANGES:undefined – {db:Database {open:true,filename:'./dindin.sqlite',mode:65542}}

如果id = 1则相同,并在一行或id = 1111111上执行更新,并在非行上执行更新。

对于我以前的问题,问题是我用胖箭头进行callback声明。 从javascript文档中,我发现在箭头函数 (胖箭头)中, 词法范围 ,所以这个结果是未定义的,没有在图书馆文档中的估价。 使用否则一致的函数,这是有界的dynamic范围 ,所以this.changes是重视。

现在,代码如下,是好的:

 var sql = 'update recipes set stars = stars + 1 where id = ?'; db.run(sql, [ 1 // id = 1 execute update - if id = 11111 do nothing ], function(err) { if(err) throw err; console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); if(this.changes == 1) console.log("WORK DONE"); else console.log("NOTHING DONE"); }); 

这里更多的解释: https : //github.com/mapbox/node-sqlite3/issues/606