2017-02-02 9 views
0

と約束:は私が順次次のタスクを実行するためのライブラリ(研究プロジェクト)からのノードのスクリプトをリバースエンジニアリングしようとしているMySQLの

1)を開き、ファイル(例えば、「読み取りINPUT.TXT ')。クエリが適切に定義されていると仮定 - 簡単のため、(1)から構築クエリを(実行)コンテンツが正しくMySQLデータベース

3への接続を作成し))

2 SQLクエリをフォーマットすることを前提としていファイル)

4)私は、これらのタスクは、オーダー(すなわち、1--4)で実行したいデータベース

との接続を終了します。私はPromises(Bluebird)の使用経験はあまりありません。ここで私がこれまで持っていたコードの抜粋です:

//Read the input file 
function readFilePromise(){ 
    return new Promise(function(resolve, reject){ 
     var filePath = path.join(__dirname, filename); 
     //asynchronous read 
     fs.readFile(filePath, 'utf8', function (err, text){ 
      if (err) 
       reject(err); 
      else 
       resolve(text.split('\n')); 
     }); 
    }) 
} 

//create connection 
function createConnectionPromise(){ 
    return new Promise(function (resolve, reject){ 
     var connection = mysql.createConnection(connectionOptions);//global 
     connection.connect(function(err){ 
      if(err){ 
       console.log('Error connecting to Db'); 
       reject(err); 
      } 
      else{ 
       console.log('Connection established'); 
       resolve(connection); 
      } 
     }); 
    }) 
} 

//do transactions 
function doTransactionsPromise (data){ 
    return new Promise(function (resolve, reject){ 
     var connection = data[0]; 
     var lines  = data[1]; 
     var topPromises = []; 

     lines.forEach(function(sSQL){ 
      var p = new Promise(function(resolve,reject){ 
       console.log('Add: ' + sSQL); 
       makeTransaction(connection, sSQL); 
       return connection; 
      }); 
      topPromises.push(p); 
     }); 
     resolve(topPromises); 
    }); 
} 

//make transaction  
function makeTransaction(connection, sSQL){ 
    connection.beginTransaction(function(err){ 
     function treatErro(err, connection) { 
      console.log('Failed to insert data in the database . Undoing!'); 
      connection.rollback(); 
     } 

    function final() { 
     connection.commit(function(err) { 
      if(err) { 
       treatErro(err, connection); 
      } 
      else { 
       console.log('Added: ' + sSQL); 
       return connection; 
      } 
     }); 
    } 

    if(err) { 
     treatErro(err, connection); 
    } 
    else { 
     connection.query(sSQL, function (err, result) { 
      if(err) { 
       console.log(sSQL); 
       treatErro(err, connection); 
      } 
      else { 
       id = result.insertId; 
      } 
     }); 
     final(); 
    } 
    }); 
} 

Promise.all([createConnectionPromise(), readFilePromise()]) 
    .then(doTransactionsPromise) 
    .then(function(promises){ 
     Promise.all(promises) 
      .then(function(data){ 
       var connection = data[0]; 
       connection.end(); 
      }); 
    }) 
    .catch(function(error) { 
     console.log('Error occurred!', error); 
    }); 

クエリが細かい実行されますが、DBへの接続は終了しません。どんな助けもありがとうございます。

PS:コードを大幅に改善できると確信しています。

答えて

1

私はあなたのコード内で参照可能な問題は、関数doTransaction私は、コードをテストしていません

function doTransactionsPromise (data){ 
    return new Promise(function (resolve, reject){ 
    var connection = data[0]; 
    var lines  = data[1]; 
    var topPromises = []; 

    lines.forEach(function(sSQL){ 
     var p = new Promise(function(resolve,reject){ 
      console.log('Add: ' + sSQL); 

      makeTransaction(connection, sSQL); 
      return connection; 
     }); 
     // P is never fullfilled. 
     //Either transfer the responsibility to full-fill the promise to makeTransaction 
     // or makeTransaction function should return the promise which is full-filled by itself. 

     topPromises.push(p); 
    }); 

    resolve(topPromises); 
}); 
} 
+0

感謝を行う必要があります。どのようにこれを試してみましょうか? – STiGMa

0

であるが、次のコードでは、提案のための

//Read the input file 
    function readFilePromise(){ 
     return new Promise(function(resolve, reject){ 
      var filePath = path.join(__dirname, filename); 
      //asynchronous read 
      fs.readFile(filePath, 'utf8', function (err, text){ 
       if (err) 
        reject(err); 
       else 
        resolve(text.split('\n')); 
      }); 
     }) 
    } 

    //create connection 
    function createConnectionPromise(){ 
     return new Promise(function (resolve, reject){ 
      var connection = mysql.createConnection(connectionOptions);//global 
      connection.connect(function(err){ 
       if(err){ 
        console.log('Error connecting to Db'); 
        reject(err); 
       } 
       else{ 
        console.log('Connection established'); 
        resolve(connection); 
       } 
      }); 
     }) 
    } 

    //do transactions 
    function doTransactionsPromise (data){ 



     var connection = data[0]; 
     var lines = data[1]; 
     var topPromises = []; 

     topPromise = lines.map(function(sSQL){ 

      return makeTransaction(connection, sSQL); 
     }); 

     return Promise.all(topPromises).then(function(){ 
       return connection; 
     },function(){ 
      return connection; 
     }); 


    } 

    //make transaction  
    function makeTransaction(connection, sSQL){ 
     return new Promise(resolve, reject, function(){ 
      connection.beginTransaction(function(err){ 

      function treatErro(err, connection) { 
       console.log('Failed to insert data in the database . Undoing!'); 
       connection.rollback(); 
       reject(connection); 

      } 

      function final() { 
       connection.commit(function(err) { 
        if(err) { 
         treatErro(err, connection); 
        } 
        else { 
         console.log('Added: ' + sSQL); 
         resolve(connection); 
         return connection; 
        } 
       }); 
      } 

      if(err) { 
       treatErro(err, connection); 
      } 
      else { 
       connection.query(sSQL, function (err, result) { 
        if(err) { 
         console.log(sSQL); 
         treatErro(err, connection); 
        } 
        else { 
         id = result.insertId; 
        } 
       }); 
       final(); 
      } 
      }); 

     }) 

    } 

    Promise.all([createConnectionPromise(), readFilePromise()]) 
     .then(doTransactionsPromise) 
     .then(function(connection){ 
      return connection.end(); 
     }) 
     .catch(function(error) { 
      console.log('Error occurred!', error); 
     }); 
関連する問題