Nodejs node-sqlite3 运行回调不起作用

Kar*_*tik 4 sqlite node.js

nodejs我正在尝试使用和package.json来删除 sqlite 数据库中的一行node-sqlite3

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

这是查询

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

无论输入错误或正确,它都会输出null到控制台。如果给出了正确的详细信息,它会删除它并打印 null,如果给出了错误的 id 和用户,它仍然打印 null。

关于可能出什么问题有什么想法吗?

谢谢

jsi*_*ist 5

这里的node和node-sqlite3行为没有任何问题。这里分两部分来解释,首先是关于node的,其他是关于Sqlite的。

Node

执行语句后将调用您的回调。所以这里没有问题,因为你的回调被调用(如输出的“null”所证明)。

Sqlite

Sqlite 中的删除查询如果where子句中给出的条件计算结果为 true 则删除,否则不会删除任何内容。

引用node-sqlite3文档的Database#run api

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

因此,在您的情况下,查询执行成功,没有任何错误,导致error回调函数的参数null如您在输出中看到的那样。

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

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

希望能帮助到你...


Mas*_*ano 5

对于我之前的问题,问题是我使用了粗箭头来声明回调。从javascript文档中我发现在箭头函数(胖箭头)中,this具有词法范围,因此这个结果未定义并且没有像库文档中所述那样被重视。使用其他匿名函数, this 在动态范围内受到限制,因此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");

    });
Run Code Online (Sandbox Code Playgroud)

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