首页 > 解决方案 > nodejs oracledb externalAuth(使用oracle钱包)

问题描述

在这个示例 nodejs 应用程序中,我尝试使用钱包连接到 oracle 数据库。钱包是在服务器中创建的,钱包目录的内容被压缩并解压缩到我项目的根文件夹中(在一个名为 的文件夹中wallet)。

进一步包含sqlnet.ora在同一文件夹中的文件。它的内容是:

WALLET_LOCATION=

(SOURCE=

(METHOD=FILE)

(METHOD_DATA=

(DIRECTORY=D:\code\js\myoracledb-app\wallet)

)

)

主程序 ( index.js) 非常简单:

const oracledb = require('oracledb');
const path = require('path');
const configDir = path.join(__dirname, 'wallet');
// oracledb.initOracleClient({ configDir: configPath });
// oracledb.initOracleClient();
const poolOptions = {  
  externalAuth: true,
  connectionString: '8.83.87.12:1522/ORCLCDB',
  configDir  
};

oracledb.createPool(poolOptions, function(err, pool){
  if(err) {
    console.error(err);
    process.exit(1);
  }
  else {
    pool.getConnection(function(err, conn){
      if(err) {
        console.error(err);
        process.exit(2);
      }
      else {
        conn.execute('select sysdate from dual', [], {}, function(err, result){
          if(err) {
            console.error(err);
            process.exit(3);
          }
          else {
            
            conn.release(function(){
              console.log('Result:', JSON.stringify(result));
              process.exit(0);
            });
          }
        });
      }
    });
  }
});

我已用作oracledb客户端来连接到我的远程数据库。我在回调中收到错误pool.getConnection()。这由返回的错误代码验证。

控制台的错误输出是:

[Error: ORA-01017: invalid username/password; logon denied] {
  errorNum: 1017,
  offset: 0
}

我尝试了各种尝试初始化 oracledb 客户端(oracledb.initOraClient()),但是,结果是一样的。我在这里做错了什么?

Ps:如果对钱包的创建方式感兴趣,请阅读这篇文章及其评论。

标签: node.jsoraclenode-oracledboracle-wallet

解决方案


我调整sqlnet.ora如下:

WALLET_LOCATION=

(SOURCE=

(METHOD=FILE)

(METHOD_DATA=

(DIRECTORY=D:\code\js\myoracledb-app\wallet)

)

)

SQLNET.WALLET_OVERRIDE=TRUE

接下来,池选项定义如下:

const poolOptions = {  
  externalAuth: true,
  connectionString: 'ORCLCDB'
};

ORCLCDB服务名称在tnsnames.ora.

ORCLCDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = <host_ip_or_name>)(PORT = <server_port>))
    )
    (CONNECT_DATA =
     (SERVICE_NAME =ORCLCDB)
    )    
   )

sqlnet.ora和文件都tnsnames.ora放在钱包文件夹中。将TNS_ADMIN环境变量设置为钱包文件夹。以下是如何在 powershell 中执行此操作的示例:

PS1 > $env:TNS_ADMIN=$(join-path $pwd wallet)

推荐阅读