Javascript 如何将节点sqlite3与q(promise)一起使用

Javascript 如何将节点sqlite3与q(promise)一起使用,javascript,sqlite,promise,Javascript,Sqlite,Promise,我正在尝试使用sqlite3的承诺。以下是我源代码的一部分: this.deleteTag=函数(标记,项目){ var db=this.db; 国际单项体育联合会(项目){ 返回q.nfcall(db.run,“从tag2project中删除,其中tag=?和project=?”, [tag.id,project.id]); }否则{ 返回q.all([ q、 nfcall(db.run,“从tag2project中删除,其中tag=?”,[tag.id]), q、 nfcall(db.run

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

this.deleteTag=函数(标记,项目){
var db=this.db;
国际单项体育联合会(项目){
返回q.nfcall(db.run,“从tag2project中删除,其中tag=?和project=?”,
[tag.id,project.id]);
}否则{
返回q.all([
q、 nfcall(db.run,“从tag2project中删除,其中tag=?”,[tag.id]),
q、 nfcall(db.run,“从id=?”的标记中删除,[tag.id])
]);
}
};
但这些承诺只有在出现错误时才生效。失败:

[类型错误:应为数据库对象]
搜索这个错误只能找到sqlite本身的源代码


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

我认为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");

您可以绑定在提示函数时创建的对象

范例

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