【问题标题】:Not getting parameter name on querying oracle db from nodejs从nodejs查询oracle db时没有获取参数名称
【发布时间】:2018-04-18 12:16:20
【问题描述】:

我正在尝试从 nodejs 查询 oracledb。下面是我用来查询的代码

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

以下是发出请求的代码:

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

其中 query1 是:“SELECT count(distinct user_id) count_value FROM chatlog where trunc(timestamp) between to_date('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 中获取了参数的名称。当我打印时得到的输出数据1是:

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

【问题讨论】:

  • 抱歉,我才看到这个……你用的是什么版本的 Node.js?
  • @DanMcGhan 我正在使用节点版本 6.11.3

标签: javascript sql node.js oracle11g node-oracledb


【解决方案1】:

simpleExecute 函数存在一些问题。第一个是您将所有内容包装在 try/catch 块中。但是,您无法捕获在 getConnectionexecute 等异步操作期间发生的异常。

下一个问题是您在使用完连接后没有将连接释放回池。

最后,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/

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2011-11-01
    相关资源
    最近更新 更多