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ので、私に同行してください。事前におかげで助けてください。
私はそれを見ましたが、私はそれからイテレータを引き出すことができなかったことがわかりました。私は同時にヘッダーと値を繰り返し処理する必要があります。私は、各配列をヘッダー配列で処理し、values配列のための別のイテレーターを保持できると思います。 – Crash667
私はおそらくeachEtherOfではないかもしれませんが、forEachOfがうまく動作し、そのキーを使って両方を反復することができます。良い方向。 – Crash667
あなたはconn.executeコールバックの外でforEachOfコールバックを呼び出しています。それをconn.executeコールバックの中に移動します。これは本当に非同期の全体のポイントです。それは、コールバックが渡されたときに次のことを行います。しかし、それは正しくタイムアウトするために依存しています。 –