Electron + node.js访问达梦数据库相关问题处理

环境安装

参考:

Electron + node.js访问达梦数据库

Electron + node.js访问达梦数据库

问题及处理

问题1:使用老的oracledb.node驱动包报错

部分报错信息:

NODE_MODULE_VERSION 64. This version of Node.js requires
NODE_MODULE_VERSION 69. Please try re-compiling or re-installing

原因:

​ 使用的达梦node.js驱动与当前electron的NODE_MODULE_VERSION版本不匹配。
​ 老的驱动最高匹配的NODE_MODULE_VERSION为64,需要使用新的达梦node.js驱动。

处理办法:

使用新的达梦node.js驱动包(注意:Node.js 的版本至少为 v12.0.0),安装方法如下:
npm install dmdb
在项目中引用dmdb包:
const db = require(“dmdb”);
使用方法参考《DM8 Program》或者《DM8程序员手册》DM Node.js 编程指南章节。

问题2:使用新的dmdb驱动包,启动项目报错”Error: Module did not self-register”

报错信息如下:

Error: Module did not self-register: 
'\\?\D:\tool\electron-quick-start\node_modules\snappy\build\Release\binding.node'.
  at process.func [as dlopen] (electron/js2c/asar.js:140:31)
  at Object.Module._extensions..node (internal/modules/cjs/loader.js:1196:18)
  at Object.func [as .node] (electron/js2c/asar.js:140:31)
  at Module.load (internal/modules/cjs/loader.js:981:32)
  at Module._load (internal/modules/cjs/loader.js:881:14)
  at Function.Module._load (electron/js2c/asar.js:769:28)
  at Module.require (internal/modules/cjs/loader.js:1023:19)
  at require (internal/modules/cjs/helpers.js:77:18)
  at bindings (D:\tool\electron-quick-start\node_modules\bindings\bindings.js:112:48)
at Object.<anonymous> (D:\tool\electron-quick-start\node_modules\snappy\snappy.js:2:34)

原因:

​ 初步判断是npm install使用了node编译snappy的链接库,而不是electron的。用node安装了的dmdb驱动,会用node编译snappy。这个编译好的snappy不能直接用于electron,需要electron重新安装dmdb(会使用electron的头文件编译snappy)。
参考:https://github.com/atom/node-keytar/issues/184

处理办法:

执行electron-rebuild重新编译相关模块。
如果未安装electron-rebuild需要先安装,安装命令如下:
npm install electron-rebuild -g
安装完成后执行 electron-rebuild,命令如下:
electron-rebuild --module-dir d:\xxxx

问题3:启动程序报错”Error: [6001] 网络通信异常 Error: [6071] 消息加密失败”

安装新的dmdb驱动包,并执行electron-rebuild后,启动程序报错。

报错信息如下:

Error: [6001] 网络通信异常
Error: [6071] 消息加密失败
Error: Unknown cipher
   at new n (D:\tool\electron-quick-start\node_modules\dmdb\src\driver\error.js:28:19)
   at Function.n.ECJS_COMMUNICATION_ERROR (D:\tool\electron-quick-start\node_modules\dmdb\src\driver\error.js:35:16)
   at e.<anonymous> (D:\tool\electron-quick-start\node_modules\dmdb\src\driver\connection.js:466:91)
   at D:\tool\electron-quick-start\node_modules\dmdb\src\driver\connection.js:108:27
   at Object.throw (D:\tool\electron-quick-start\node_modules\dmdb\src\driver\connection.js:119:14)
   at e (D:\tool\electron-quick-start\node_modules\dmdb\src\driver\connection.js:31:26)
   at processTicksAndRejections (internal/process/task_queues.js:97:5)

原因:
node用的是OpenSSL,而Electron用的是BoringSSL,可以通过crypto.getCiphers()查看Electron支持的加密算法。
因为连接串属性loginEncrypt默认是true,与数据库通信会用特定加密算法加密消息(dm.ini中的COMM_ENCRYPT_NAME控制具体使用的加密算法)
参考:https://github.com/electron/electron/issues/16195

处理办法:

两种办法:
第一种:如果对加密要求不高或者开发环境:可以设置loginEncrypt=false
第二种:dm.ini指定electron支持的加密算法

具体如下:
第一种方法更改数据库连接串,加上loginEncrypt=false,如下:
connectString: "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=false&loginEncrypt=false"

第二种方法需要查看electron支持的加密算法和达梦数据库支持的加密算法(查看V$CIPHERS视图)

(1)查看electron支持的加密算法,通过crypto.getCiphers(),代码如下:

const crypto = require('crypto')
const ciphers = crypto.getCiphers()
console.log(ciphers)

可以将其加入到js代码开头,然后执行可以看到支持的加密算法。例如:
D:\tool\node_electron>npm start
> node_electron@1.0.0 start D:\tool\node_electron
> electron .
[
‘aes-128-cbc’, ‘aes-128-cfb’,
‘aes-128-ctr’, ‘aes-128-ecb’,
‘aes-128-gcm’, ‘aes-128-ofb’,
‘aes-192-cbc’, ‘aes-192-ctr’,
‘aes-192-ecb’, ‘aes-192-gcm’,
‘aes-192-ofb’, ‘aes-256-cbc’,
‘aes-256-cfb’, ‘aes-256-ctr’,
‘aes-256-ecb’, ‘aes-256-gcm’,
‘aes-256-ofb’, ‘des-cbc’,
‘des-ecb’, ‘des-ede’,
‘des-ede-cbc’, ‘des-ede3-cbc’,
‘rc2-cbc’, ‘rc4’
]

(2)查看达梦数据库支持的相同的加密算法

SELECT * FROM V$CIPHERS
Where CYT_NAME in ('AES_128_CBC', 'AES_128_CFB', 'AES_128_CTR', 'AES_128_ECB', 'AES_128_GCM', 'AES_128_OFB', 'AES_192_CBC', 'AES_192_CTR', 'AES_192_ECB', 'AES_192_GCM', 'AES_192_OFB', 'AES_256_CBC', 'AES_256_CFB', 'AES_256_CTR', 'AES_256_ECB', 'AES_256_GCM', 'AES_256_OFB', 'DES_CBC', 'DES_ECB', 'DES_EDE', 'DES_EDE_CBC', 'DES_EDE3_CBC', 'RC2_CBC', 'RC4');

img

可以查询到electron与达梦数据库都支持的算法有3种,那么可以将dm.ini中的COMM_ENCRYPT_NAME设置为RC4,命令如下:

SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','RC4');

然后重启数据库;
–查询参数

SQL> select para_name,para_value from v$dm_ini where para_name='COMM_ENCRYPT_NAME';

行号    PARA_NAME     PARA_VALUE
---------- ----------------- ----------
1      COMM_ENCRYPT_NAME RC4

–启动程序,正常
img

持续更新ing…
更多资讯请上达梦技术社区了解:https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值