2016-06-20 6 views
0

UPDATE:コードは下記(6-20-2016)に更新されました。私はまだ非同期のウォーターフォールを終了することに問題がありますが、コールバックを.forEachOf関数の関数(エラー)部分に追加すると、それでもエラーが表示されます。接続oracledbモジュールnode.jsを解放する前に複数のステートメントを実行

node.js用のoracledbモジュールを使用して、複数のinsert文を実行して、2つの配列の各値をoracleデータベースに挿入しようとしています。私はforループを使用して、次のinsert文で各配列を調べるためにイテレータを使用しようとしました。私はnode.jsを初めて使用しており、接続を解放するために早期に呼び出されていると思われるコールバックを理解するのに問題があります。エラーが発生しています...

NJS-032: connection cannot be released because a database call is in progress 

ここに私が使用している機能コードがあります。

var doinsert2 = function (conn, cb) { 
    //for(var i = 0; i<headers.length; i++) 
    async.forEachOf(headers, function (value, key, callback) 
    { 
     conn.execute(
     "INSERT INTO " + db_extern_msg_prop + " VALUES ('" + unique_id + "','" + headers[key] + "',0,'" + values[key] + "')", 
     //[unique_id, 'prop name test', 0, 'prop value test'], // Bind values 
     function(err, result) 
     { 
      if (err) { 
      //return cb(err, conn); 
      console.log("Error: " + err); 
      } else { 
      //console.log("SECOND INSERT : Rows inserted: " + result.rowsAffected); // 1 
      //return cb(null, conn); 
      } 
     }); 
     callback(); 
    },function (err) { 
    //return cb(null, conn);  
    }); 

}; 

//used to order the functions to be processed. 
//This keeps the connection first, and the same unique id for both tables. 
async.waterfall(
    [ 
    doconnect, 
    doinsert1, 
    doinsert2 
    ], 
    function (err, conn) { 
    if (err) { console.error("In waterfall error cb: ", err, " "); } 
    if (conn) 
     dorelease(conn); 
    }); 

すべてのレコードは罰金に入力されているが、私はより良い私が行方不明ですかを理解したいと思います。また、かなり新しいstackoverflowので、私に同行してください。事前におかげで助けてください。

答えて

0

私はあなたが非同期を使用しているのを見て、それは良いです。 async.eachSeriesを使って、forループの代わりにヘッダ配列を繰り返し処理します。

+0

私はそれを見ましたが、私はそれからイテレータを引き出すことができなかったことがわかりました。私は同時にヘッダーと値を繰り返し処理する必要があります。私は、各配列をヘッダー配列で処理し、values配列のための別のイテレーターを保持できると思います。 – Crash667

+0

私はおそらくeachEtherOfではないかもしれませんが、forEachOfがうまく動作し、そのキーを使って両方を反復することができます。良い方向。 – Crash667

+0

あなたはconn.executeコールバックの外でforEachOfコールバックを呼び出しています。それをconn.executeコールバックの中に移動します。これは本当に非同期の全体のポイントです。それは、コールバックが渡されたときに次のことを行います。しかし、それは正しくタイムアウトするために依存しています。 –

関連する問題