[英]How to use node sqlite3 with q (promise)
我正在尝试使用sqlite3的promise。 这是我的源代码的一部分:
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查询中没有错误。
我认为db.run不是函数而是方法。 来自Q doc:
如果您正在使用方法而不是简单的函数,您可以轻松地遇到将方法传递给另一个函数的常见问题,例如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");
您可以绑定在宣传该函数时创建的对象。
例
const { promisify } = require('util');
const db = new lib_sqlite3.Database(_dirname + '/your-db-path');
const runAsync = promisify(db.run.bind(db));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.