nodejs oracledb externalAuth(使用oracle钱包)

Posted

技术标签:

【中文标题】nodejs oracledb externalAuth(使用oracle钱包)【英文标题】:nodejs oracledb externalAuth (using oracle wallet) 【发布时间】:2021-01-07 13:45:42 【问题描述】:

在这个示例 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:如果对钱包的创建方式感兴趣,请阅读 this 帖子及其 cmets。

【问题讨论】:

钱包是否包含数据库用户名和密码?并非所有人都这样做。例如,Oracle 云自治数据库的钱包就没有。见blogs.oracle.com/opal/… 首先让它与 SQL*Plus 一起工作,然后它才能与 node-oracledb 一起工作——它们都使用相同的内部库 API。这将使更多的人帮助您,您也可以使用 Oracle 支持。 【参考方案1】:

我将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.oratnsnames.ora 文件都放在了钱包文件夹中。将TNS_ADMIN 环境变量设置为钱包文件夹。以下是如何在 powershell 中执行此操作的示例:

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

【讨论】:

以上是关于nodejs oracledb externalAuth(使用oracle钱包)的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下 nodejs 使用官方oracledb库连接数据库 教程

从nodejs连接oracle

NodeJS-004-Oracle驱动编译

从 NodeJS 查询 Oracle 数据库中的大型数据集

NodeJS,Oracle DB参数的部分绑定给出:ORA-01036

npm install node-oracledb 失败