【问题标题】:How to use node sqlite3 with q (promise)如何将节点 sqlite3 与 q 一起使用(promise)
【发布时间】:2014-03-11 13:01:38
【问题描述】:

我正在尝试使用 sqlite3 的承诺。这是我的源代码的一部分:

this.deleteTag = function(tag, project){
    var db = this.db;
    if (project){
        return q.nfcall(db.run, "DELETE FROM tag2project WHERE tag = ? AND project = ?",
            [tag.id, project.id]);
    }else{
        return q.all([
            q.nfcall(db.run, "DELETE FROM tag2project WHERE tag = ?", [tag.id]),
            q.nfcall(db.run, "DELETE FROM tags WHERE id = ?", [tag.id])
        ]);
    }
};

但那些承诺只在错误为 .fail 的地方输入:

[TypeError: Database object expected]

搜索这个错误只让我找到了 sqlite 本身的源代码https://github.com/joyent/smartos-live/blob/master/src/node-sqlite3/src/statement.cc#L91

使用简单回调的旧版本正在工作,因此this.db或sql查询没有错误。

【问题讨论】:

    标签: javascript sqlite promise


    【解决方案1】:

    我认为 db.run 不是函数而是方法。来自 Q 文档:

    如果您使用的是方法,而不是简单的函数,您可以 很容易遇到将方法传递给另一个方法的常见问题 函数(如 Q.nfcall)从其所有者“解除绑定”该方法。避免 这个,你可以使用 Function.prototype.bind 或者一些不错的 我们提供的快捷方式:

    return Q.ninvoke(redisClient, "get", "user:1:id");
    return Q.npost(redisClient, "get", ["user:1:id"]);
    

    但我总是使用 Q.denodeify 或 Q.nbind。它更干净。

    您还可以使用 Q.denodeify 或 Q.nbind 创建可重复使用的包装器:

    var readFile = Q.denodeify(FS.readFile);
    return readFile("foo.txt", "utf-8");
    
    var redisClientGet = Q.nbind(redisClient.get, redisClient);
    return redisClientGet("user:1:id");
    

    【讨论】:

      【解决方案2】:

      你可以绑定你在promisify函数时创建的对象。

      例子

      const { promisify } = require('util');
      const db = new lib_sqlite3.Database(_dirname + '/your-db-path');
      
      const runAsync = promisify(db.run.bind(db));
      
      

      【讨论】:

        猜你喜欢
        • 2015-08-03
        • 2018-10-24
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多