nodejs oracledb externalAuth(使用oracle wallet)
nodejs oracledb externalAuth (using oracle wallet)
在此示例 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 post 及其评论。
我调整了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)
在此示例 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 post 及其评论。
我调整了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)