如何通过Cloud Wallet将Sequelize连接至Oracle数据库?
Node.js + Sequelize 连接带Cloud Wallet的Oracle数据库解决方案
问题说明
已通过SQLDeveloper使用Cloud Wallet文件成功连接Oracle数据库,但使用Sequelize连接时返回错误:
"original: Error: NJS-500: 与Oracle数据库的连接已中断"
错误原因
仅传递CA证书无法满足Cloud Wallet的身份验证要求,Oracle Cloud Wallet需要完整的Wallet文件(cwallet.sso或ewallet.p12)及配套配置文件才能建立安全连接。
解决方案
1. 确保依赖安装
先确认已安装所需依赖包:
npm install sequelize oracledb
2. 方式一:通过TNS名称连接(推荐)
利用已有的tnsnames.ora和Wallet文件,直接指定TNS别名完成连接:
const Sequelize = require('sequelize'); // 配置Wallet文件所在目录的环境变量(也可在系统环境变量中设置) process.env.TNS_ADMIN = __dirname + '/../../'; // 替换为你的Wallet文件目录 process.env.ORACLE_WALLET = __dirname + '/../../'; const _sequelize = new Sequelize( null, config.database.username, config.database.password, { dialect: 'oracle', logging: false, dialectOptions: { connectString: config.database.tnsAlias, // tnsnames.ora中对应的服务别名 walletLocation: __dirname + '/../../' // Wallet文件所在目录 } } ); _sequelize.authenticate() .then(() => console.log('Connection to DB : [OK]')) .catch(error => { console.error('Connection to DB : [KO]'); console.error(error); }); module.exports = _sequelize;
3. 方式二:直接配置连接参数
若不想使用TNS名称,可手动配置连接参数并指定Wallet:
const Sequelize = require('sequelize'); const _sequelize = new Sequelize( config.database.servicename, config.database.username, config.database.password, { host: config.database.address, port: config.database.port, dialect: 'oracle', logging: false, dialectOptions: { ssl: true, walletLocation: __dirname + '/../../', // Wallet文件所在目录 // 若Wallet设置了密码,需添加以下参数 // walletPassword: config.database.walletPassword } } ); _sequelize.authenticate() .then(() => console.log('Connection to DB : [OK]')) .catch(error => { console.error('Connection to DB : [KO]'); console.error(error); }); module.exports = _sequelize;
4. 注意事项
- 确保所有Wallet相关文件(
cwallet.sso、ewallet.p12、sqlnet.ora、tnsnames.ora)都放在指定目录下,且Node.js进程拥有读取权限。 sqlnet.ora中需包含Wallet配置,默认可添加以下内容(若原有文件无此配置):WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY = ./))) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE- 如果Wallet设置了密码,必须在
dialectOptions中添加walletPassword参数。
内容的提问来源于stack exchange,提问作者Blazkowicz
相关产品推荐
相关产品推荐

