使用 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);
                    }
                });
            });

        })

你这里发生的两件事据我所知是不正确的。

  1. 您没有正确实现上述代码中的承诺。调用 Promise 返回方法时不会传入错误优先回调,而是将结果值传递给最近的 .then()。如果发生错误,他们会将其传递给最近的 .catch()。如果没有 .catch() 并且出现错误,则会抛出 unhandledRejection 错误。
  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);
    });