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

时间:2012-04-05 05:14:17

标签: node.js sqlite

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

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

这是查询

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

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

关于可能出错的任何想法?

由于

4 个答案:

答案 0 :(得分:4)

此处的节点和node-sqlite3行为没有任何问题。 以下是关于Sqlite的节点和其他方面的两个部分。

<强> Node

执行语句后会调用您的回调。所以没有错,因为你的回调被调用(由'null'作为输出证明)。

Sqlite

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

参考node-sqlite3 documentation's Database#run api

  

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

因此,在您的情况下,查询执行成功没有任何错误,导致回调函数error的{​​{1}}参数,如输出中所示。

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

  

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

希望它有所帮助...

答案 1 :(得分:2)

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

搜索process.exit,可能(或可能不会)为您节省数小时的调试和指责sqlite:)

关闭主题:我的想法是什么,为什么他们在lastID中全部限制ID。它不像是SQL或美国这样的缩写。它代表身份证明,这是一个词。

答案 2 :(得分:1)

我对nodejs 4.3和sqlite3:3.1.1。

有一些问题

问题在于,当更新对任何行没有影响时更新对一行有效时我想分开(不先执行select)。

在我的示例中,我有一个id = 1的行。我想知道当我使用id = 1111进行更新时,没有任何行受到影响。

我在database.run上使用了回调,但是当在数据库中的某行上执行更新时,似乎没有对 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");

    });

this.changes是未定义的,即使正确执行更新(当我使用id时也是如此,例如1111111,而不是在数据库中)。

有错误或者我不了解如何使用回调?

控制台上的结果是: VALUE CHANGES:undefined - {db:Database {open:true,filename:&#39; ./ dindin.sqlite&#39;,mode:65542}}

如果id = 1则相同并在一行上执行update或id = 1111111并在无行上执行update。

答案 3 :(得分:1)

对于我的prevoius问题,问题是我使用胖箭头进行回调声明。从javascript文档中我发现在箭头函数(胖箭头)中,具有词法范围,因此此结果未定义且未被评估为在图书馆文件中说。使用其他无效函数,这在动态范围中有界限,因此 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