使用promisefiy时出错

我使用promisifyAll到以下模块,因为我想使用它与承诺,我得到错误“TypeError:不能读取属性'然后'未定义”

const DBWrapper = Promise.promisifyAll(require("node-dbi").DBWrapper); var dbWrapper = new DBWrapper('pg', dbConnectionConfig); dbWrapper.connect(); dbWrapper.insert('USERS', data, function (err, data) { if (err) { console.log("error to insert data: " + err); } else { console.log("test" + data); } }).then(() => { //read data dbWrapper.fetchAll("SELECT * FROM USERS", null, function (err, result) { if (!err) { console.log("Data came back from the DB.", result); } else { console.log("DB returned an error: %s", err); } dbWrapper.close(function (close_err) { if (close_err) { console.log("Error while disconnecting: %s", close_err); } }); }); }) 

你有两件事情在我看来是不正确的。

  1. 在上面的代码中,你没有正确地实现承诺。 当调用Promise返回方法时,第一个callback函数没有被传入,而是将结果值传递给最接近的.then() 。 如果发生错误,他们会将其传递到最近的.catch() 。 如果没有.catch()并且发生错误,则会抛出unhandledRejection .catch()错误。
  2. 默认情况下, 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); });