Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用promisefiy all时出错_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 使用promisefiy all时出错

Javascript 使用promisefiy all时出错,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我对以下模块使用promisifyAll,因为我想将其与Promissions一起使用,但出现了错误“TypeError:无法读取未定义的'then'属性” 你有两件事是不正确的 您没有正确地实现上述代码中的承诺。调用承诺返回方法时,不会传入错误优先回调,而是将结果值传递到最近的.then()。如果发生错误,他们会将其传递到最近的.catch()。如果没有.catch()且发生错误,则将抛出未处理的弹出错误 默认情况下,promisifyAll()将后缀Async附加到任何promisified

我对以下模块使用promisifyAll,因为我想将其与Promissions一起使用,但出现了错误“TypeError:无法读取未定义的'then'属性”


你有两件事是不正确的

  • 您没有正确地实现上述代码中的承诺。调用承诺返回方法时,不会传入错误优先回调,而是将结果值传递到最近的
    .then()
    。如果发生错误,他们会将其传递到最近的
    .catch()
    。如果没有
    .catch()
    且发生错误,则将抛出
    未处理的弹出
    错误
  • 默认情况下,
    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后带有承诺的方法具有
    Ascyn
    后缀:
    insertAsync
    fetchAllAsync
    如果要使用承诺,为什么还要传递回调???:谢谢我尝试了一下,但我得到了错误:TypeError:dbWrapper.insertAsync不是函数,有什么想法吗?@RaynD我已经更新了答案,查看
    节点dbi
    代码后,需要对
    DBWrapper
    的实例执行
    promisifyAll()
    。这是因为
    new
    创建了
    DBWrapper
    的一个实例,而
    DBWrapper
    的原型实际上没有函数的预期版本,因此我们需要
    promisifyAll()
    DBWrapper的实例,而不是
    DBWrapper
    本身。
    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);
        });