2016-09-16 1 views
1
내가 약속을 사용하려면 내가 오류 "형식 오류를 : 속성을 읽을 수 없습니다 '다음'정의의"가지고 있기 때문에 나는 다음과 같은 모듈에 promisifyAll를 사용

오류 promisefiy 사용하는 동안 모든

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

방법을 기대 한대로 promisifyall'Ascyn' 접미사가 후 DB 호출이 올바른지 다음 코드는 작동합니다 fetchAllAsync' –

+0

약속을 사용하려면 왜 콜백을 계속 전달합니까? – Bergi

답변

1

당신은 두 가지가 여기에서 나가는 것은 내가 말할 수있는 것에서 부정확하다.

  1. 위의 코드에서 약속을 제대로 이행하지 않았습니다. 첫 번째 콜백 오류는 Promise가 반환하는 메소드를 호출 할 때 전달되지 않고 결과 값을 가장 가까운 .then()에 전달합니다. 오류가 발생하면 가장 가까운 .catch()으로 전달합니다. .catch()이없고 오류가 발생하면 unhandledRejection 오류가 발생합니다.
  2. 기본적으로 promisifyAll()은 약속 된 메서드에 Async이라는 접미사를 추가하므로 dbWrapper에있는 메서드 호출을 수정해야합니다. ``insertAsync` : node-dbi 가정

는 promisifed 수 있으며, 처음 약속

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); 
    }); 
+0

: 고맙습니다. 시도해 보지만 오류가 있습니다. TypeError : dbWrapper.insertAsync는 함수가 아닙니다. 어떤 생각입니까? –

+0

@RaynD 'node-dbi' 코드를보고 나서 내 대답을 업데이트했습니다. DBWrapper의 * 인스턴스 *에서'promisifyAll()'을 할 필요가 있습니다. 이것은'new'가'DBWrapper'의 인스턴스를 생성하고'DBWrapper'의 프로토 타입이 실제로 함수의 약속 된 버전을 가지고 있지 않기 때문에'DBWrapper'의 * 인스턴스 *를'promisifyAll()'해야하고 DBWrapper 자체는 아닙니다. – peteb