使用 promisefiy all 时出错
Error while using promisefiy all
我将 promisifyAll 用于以下模块,因为我想将它与 promises 一起使用,但出现错误 "TypeError: Cannot read property 'then' of undefined"
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);
}
});
});
})
你这里发生的两件事据我所知是不正确的。
- 您没有正确实现上述代码中的承诺。调用 Promise 返回方法时不会传入错误优先回调,而是将结果值传递给最近的
.then()
。如果发生错误,他们会将其传递给最近的 .catch()
。如果没有 .catch()
并且出现错误,则会抛出 unhandledRejection
错误。
- 默认情况下,
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 用于以下模块,因为我想将它与 promises 一起使用,但出现错误 "TypeError: Cannot read property 'then' of undefined"
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);
}
});
});
})
你这里发生的两件事据我所知是不正确的。
- 您没有正确实现上述代码中的承诺。调用 Promise 返回方法时不会传入错误优先回调,而是将结果值传递给最近的
.then()
。如果发生错误,他们会将其传递给最近的.catch()
。如果没有.catch()
并且出现错误,则会抛出unhandledRejection
错误。 - 默认情况下,
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);
});