问题描述
在这个示例 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',[],{},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 帖子及其评论。
解决方法
我调整了 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)