【问题标题】:How to check whether update succeeded in node.js and sqlite3 ?如何检查 node.js 和 sqlite3 是否更新成功?
【发布时间】:2021-01-08 23:10:30
【问题描述】:

在使用 node.js 和从 npm install sqlite3 安装的 sqlite3 包(https://github.com/developmentseed/node-sqlite3/wiki/ API)

要执行更新,我正在执行以下操作:

    var id = req.params.id;
    var thing = req.body;
    stmt = db.prepare("UPDATE FOO set name=?, year=? where id=?");
    stmt.bind(thing.name, thing.year, id);
    stmt.run(function(err, result) {
        if (err) {
            res.send(JSON.stringify(err));
            res.send({'error':'An error has occurred'});
        } else {
            if (result) {
                console.log('Success: ' + JSON.stringify(result));
            }
            res.send(JSON.stringify(wine));
        }
    });

但是,从未定义结果。

如果我将 stmt.run() 更改为 stmt.all(),我会得到一个结果,但它似乎是空的 - 将它打印到控制台不会显示任何内容。

【问题讨论】:

    标签: node.js rest sqlite


    【解决方案1】:

    result 用于从 SELECT 查询返回的记录。

    如果UPDATE 命令失败,您将得到err

    要了解有多少记录已更新,请参阅changes

    【讨论】:

    • Hmm - 使用上面的代码,尝试更新一个从不存在的行(因此指定一个在数据库中不存在的 id),err 仍然没有定义/填充。这就是我查看结果字段的原因,因为 err 是未定义的。
    • 如果没有什么要更新的,在上面的代码之后err仍然是未定义的。但是,函数内部的 this.changes 似乎确实解决了这个问题 - 谢谢!
    • 旁注:一个es6风格的函数会自动绑定到词法this,阻止你在回调中访问上面的this.changes
    【解决方案2】:

    我遇到了返回未定义的问题。我通过改变我的方法来修复它

    来自:

    db.run(query, [data.isActive, data.id], (err) => {
        if (err) {
            console.log(err);
            res.status(500).send({'Response':'Error updating user', err });
        } else {
            console.log(`Rows affected: ${this.changes}`)
            res.status(200).send({'Response': 'Success updating'});
        };
    });
    

    收件人:

    db.run(query, [data.isActive, data.id], async function (err) {
        if (err) {
            console.log(err);
            res.status(500).send({'Response':'Error updating user', err });
        } else {
            console.log(`Rows affected: ${this.changes}`)
            res.status(200).send({'Response': 'Success updating'});
        };
    });
    

    注意第一行,我把它从箭头函数改成了异步函数。

    【讨论】:

    • 1.实际代码,谢谢! 2. async 是不必要的(因为函数体没有做任何异步操作)。关键是只使用常规函数(并且不是箭头函数),因为需要在函数内访问this
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多