我将promisifyAll用于以下模块,因为我想将它与promises一起使用,我收到错误" 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);
}
});
});
})
答案 0 :(得分:1)
这里有两件事我说的不正确。
.then()
。如果发生错误,他们会将其传递给最近的.catch()
。如果没有.catch()
并且发生错误,则会引发unhandledRejection
错误。promisifyAll()
会将后缀Async
附加到任何已宣传的方法,因此您需要相应地修改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);
});