使用promisefiy all时出错

时间:2016-09-16 07:04:46

标签: javascript node.js promise bluebird

我将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);
                    }
                });
            });

        })

1 个答案:

答案 0 :(得分:1)

这里有两件事我说的不正确。

  1. 您未能正确实施上述代码中的承诺。在调用Promise返回方法时,第一个回调错误没有被传入,而是将结果值传递给最近的.then()。如果发生错误,他们会将其传递给最近的.catch()。如果没有.catch()并且发生错误,则会引发unhandledRejection错误。
  2. 默认情况下,promisifyAll()会将后缀Async附加到任何已宣传的方法,因此您需要相应地修改dbWrapper上的任何方法调用。
  3. 假设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);
        });