2017-11-06 5 views
1

nodejsからoracledbを問い合せようとしています。以下iは以下nodejsからoracle dbへの問合せでパラメータ名が取得されない

exports.simpleExecute = function(query,bindParams, options,callback) { 
try { 
pool.getConnection(function(err, connection) { 
    if (err) { 
    console.log(err); 
    } 
    connection.execute(query,bindParams, options,function(err, data) { 
    console.log(data); 
    if (err) { 
     console.log(err); 
     response.send({}) 
    } 
    callback(null, data); 
    }) 
}) 
} catch (err) { 
callback(err, null); 
} 
} 

を照会するために使用するコードは、要求を行っているコードである:

Query1をある
database.simpleExecute(query1,{},{outFormat: database.OBJECT},function(err, data1) { 
    // console.log(data2); 
    if (err) { 
    console.log(err); 
    response.send({}); 
    } 
    var percentChange = ((data1.rows[0].COUNT - data1.rows[0].COUNT)/data2.rows[0].COUNT) * 100; 
    var data = [data1.rows[0].COUNT, percentChange]; 
    response.send(data); 
}); 

:TRUNC(chatlog FROM「SELECT COUNT(別個USER_ID)count_value ( '2017-09-09'、 'YYYY-MM-DD')とto_date( '2017-10-08'、 'YYYY-MM-DD')との間のタイムスタンプ)

問題は、オブジェクトの配列が配列のように来るのではなく、data1.rowsパラメータが来ます。以前は、私はhttps://jsao.io/2015/03/making-a-wrapper-module-for-the-node-js-driver-for-oracle-database/から取得した接続とクエリのためのいくつかの別のメソッドを試してみました。そのケースではうまくいくようです。私はdata1.rowsのパラメータの名前も取得していました。 :

{ rows: [ [ 1 ] ], 
resultSet: undefined, 
outBinds: undefined, 
rowsAffected: undefined, 
metaData: [ { name: 'COUNT' } ] } 
+0

申し訳ありませんが、私はちょうどノードのこの...どのバージョンを見ました。あなたは使用していますか? –

+0

@DanMcGhanノードバージョン6.11.3を使用しています –

答えて

0

simpleExecute機能にはいくつかの問題があります。最初はtry/catchブロック内のすべてをラップしています。ただし、非同期操作中に発生する例外(たとえば、getConnectionおよびexecute)をキャッチすることはできません。

次の問題は、使用した後に接続をプールに戻していないことです。

最後に、simpleExecuteにはresponse.send({})という参照があります。これは、呼び出し元の関数がそれを処理するものではありません。ここで

は、あなたがこれを書くことができる方法の例です:

const oracledb = require('oracledb'); 
const config = require('./dbConfig.js'); 
let pool; 

// Callback style simpleExecute 
function simpleExecute(query, bindParams, options, callback) { 
    pool.getConnection(function(err, conn) { 
    if (err) { 
     callback(err); 
     return 
    } 

    conn.execute(query, bindParams, options, function(err, result) { 
     if (err) { 
     callback(err); 
     } else { 
     callback(null, result); 
     } 

     conn.close(function(err) { 
     if (err) { 
      console.log('error closing conn', err); 
     } 
     }); 
    }); 
    }); 
} 

// Example of using simpleExecute after creating the pool 
oracledb.createPool(config, function(err, p) { 
    if (err) { 
    throw err; 
    } 

    pool = p; 

    simpleExecute(
    'select count(*) cnt from dual', 
    {}, 
    { 
     outFormat: oracledb.OBJECT 
    }, 
    function(err, result) { 
     if (err) { 
     console.log(err); 
     return; 
     } 

     console.log(result.rows); // [ { CNT: 1 } ] 
    } 
); 
}); 

あなたは便利な非同期パターンにこのシリーズを見つけるかもしれない:https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/

関連する問題