Javascript 使用promisefiy all时出错
我对以下模块使用promisifyAll,因为我想将其与Promissions一起使用,但出现了错误“TypeError:无法读取未定义的'then'属性”Javascript 使用promisefiy all时出错,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我对以下模块使用promisifyAll,因为我想将其与Promissions一起使用,但出现了错误“TypeError:无法读取未定义的'then'属性” 你有两件事是不正确的 您没有正确地实现上述代码中的承诺。调用承诺返回方法时,不会传入错误优先回调,而是将结果值传递到最近的.then()。如果发生错误,他们会将其传递到最近的.catch()。如果没有.catch()且发生错误,则将抛出未处理的弹出错误 默认情况下,promisifyAll()将后缀Async附加到任何promisified
你有两件事是不正确的
.then()
。如果发生错误,他们会将其传递到最近的.catch()
。如果没有.catch()
且发生错误,则将抛出未处理的弹出
错误promisifyAll()
将后缀Async
附加到任何promisified方法,因此您需要相应地修改dbWrapper
上的任何方法调用node dbi
可以实现,并且您的数据库调用是正确的,那么下面的代码应该按照您最初预期的那样工作
const Promise = require('bluebird');
const DBWrapper = require("node-dbi").DBWrapper;
const dbWrapper = Promise.promisifyAll(new DBWrapper('pg', dbConnectionConfig));
return dbWrapper.insertAsync('USERS', data)
.then((data) => {
console.log("test" + data);
//read data
return dbWrapper.fetchAllAsync("SELECT * FROM USERS", null)
})
.then((result) => {
console.log('Data came back from DB.', result);
return dbWrapper.closeAsync();
})
.catch((err) => {
console.log('An error occurred:', err);
});
promisifyall后带有承诺的方法具有
Ascyn
后缀:insertAsync
,fetchAllAsync
如果要使用承诺,为什么还要传递回调???:谢谢我尝试了一下,但我得到了错误:TypeError:dbWrapper.insertAsync不是函数,有什么想法吗?@RaynD我已经更新了答案,查看节点dbi
代码后,需要对DBWrapper
的实例执行promisifyAll()
。这是因为new
创建了DBWrapper
的一个实例,而DBWrapper
的原型实际上没有函数的预期版本,因此我们需要promisifyAll()
DBWrapper的实例,而不是DBWrapper
本身。
const Promise = require('bluebird');
const DBWrapper = require("node-dbi").DBWrapper;
const dbWrapper = Promise.promisifyAll(new DBWrapper('pg', dbConnectionConfig));
return dbWrapper.insertAsync('USERS', data)
.then((data) => {
console.log("test" + data);
//read data
return dbWrapper.fetchAllAsync("SELECT * FROM USERS", null)
})
.then((result) => {
console.log('Data came back from DB.', result);
return dbWrapper.closeAsync();
})
.catch((err) => {
console.log('An error occurred:', err);
});