Node.js

Node.js 怎么连接达梦数据库

具体的连接方式以及步骤,请参考安装目录的 doc 目录下的《DM_程序员手册》中的 “DM Node.js 编程指南”章节。

node.js+electron 环境,启动程序报错 ”Error: [6001] 网络通信错误异常"

【问题描述】
安装新的 dm 驱动包,并执行 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 控制具体使用的加密算法)

【解决方法】

两种办法:

第一种:如果对加密要求不高或者开发环境:可以设置 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');

加密算法查询结果

可以查询到 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

启动程序,正常

正确查询结果

微信扫码
分享文档
扫一扫
联系客服