一、前言
1.1 概述
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,由于 Node.js 没有标准的数据库接口规范,故达梦公司根据达梦数据库的特点,为开发人员提供一套 DM Node.js 数据库驱动接口,其包名为 dmdb。下面将详细介绍 dmdb 包在达梦数据库上的用法。
本次所需的 dmdb 在 npm 的地址为:https://www.npmjs.com/package/dmdb 。
1.2 版本要求
Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/ 。
Node.js 历史版本下载地址:https://nodejs.org/dist/ 。
注意达梦数据库要求 Node.js 的版本至少为 v12.0.0。
二、Linux 下连接达梦
2.1 开发环境准备
名称 | 版本 |
---|---|
操作系统 | Centos7 64 位 |
DM 数据库 | DM 8.0 及以上版本 |
Node.js | 14.16.0 |
2.2 达梦数据库安装
请参考《数据库环境准备》。
2.3 安装 node.js
- 下载安装包。
- 解压压缩包。
tar xvf node-v14.16.0-linux-x64.tar.xz
- 修改文件所属权限。
chown -R dmdba.dinstall /home/dmdba/node-v14.16.0-linux-x64/
- 切换用户。
su - dmdba
- 输出版本号。
./node -v
- 配置环境变量。
vi .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/dmdba/node-v14.16.0-linux-x64/bin
export PATH
source .bash_profile
2.4 安装 dmdb 包
2.4.1 有网络环境下
使用 npm 命令下载 dmdb 。
npm install dmdb
查看 node_modules 目录下是否有 dmdb
注意安装部署如有问题参考 https://www.npmjs.com/packagenode-gyp,也可直接使用无网络环境下的离线压缩包安装!
2.4.2 无网络的环境下
使用安装包 node_modules_linux.zip ,本安装包是从镜像源 https://registry.npmjs.org/ 下载, linux 环境下请使用此压缩包,使用方法为找到 node 安装目录,然后把压缩包解压在安装目录的 node_modules 目录下。
2.5 测试代码编写
- 提前在 /data/nodejs_test/ 目录下准备“三国演义.jpg”图片。
- 编写 nodeJsTest.js 文件。
//该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。
//引入 dmdb 包
var db = require('dmdb');
var fs = require('fs');
var pool, conn;
async function example() {
try {
pool = await createPool();
conn = await getConnection();
await queryWithResultSet();
await insertTable();
await updateTable();
await queryTable();
await deleteTable();
await queryWithResultSet();
} catch (err) {
console.log(err);
} finally {
try {
await conn.close();
await pool.close();
} catch (err) {}
}
}
example();
//创建连接池
async function createPool() {
try {
return db.createPool({
connectString: "dm://SYSDBA:*****\@localhost:5236?autoCommit=false",
poolMax: 10,
poolMin: 1
});
} catch (err) {
throw new Error("createPool error: " + err.message);
}
}
//
//获取数据库连接
async function getConnection() {
try {
return pool.getConnection();
} catch (err) {
throw new Error("getConnection error: " + err.message);
}
}
//往产品信息表插入数据
async function insertTable() {
try {
var sql = "INSERT INTO production.product(name,author,publisher,publishtime,"
+
"product_subcategoryid,productno,satetystocklevel,originalprice,nowprice,discount,"
+ "description,photo,type,papertotal,wordtotal,sellstarttime,sellendtime) "
+ "VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17);";
console.log("开始插入数据!");
var blob = fs.createReadStream("/data/nodejs_test/三国演义.jpg");
await conn.execute(
sql,
[
{ val: "三国演义" },
{ val: "罗贯中" },
{ val: "中华书局" },
{ val: new Date("2005-04-01") },
{ val: 4 },
{ val: "9787101046121" },
{ val: 10 },
{ val: 19.0000 },
{ val: 15.2000 },
{ val: 8.0 },
{ val:"《三国演义》是中国第一部长篇章回体小说,中国小说由短篇发展至长篇的原因与说书有关。"},
{ val: blob },
{ val: "25" },
{ val: 943 },
{ val: 93000 },
{ val: new Date("2006-03-20") },
{ val: new Date("1900-01-01") }
]
);
conn.execute("commit;");
console.log("插入数据结束!");
} catch (err) {
throw new Error("insertTable error: " + err.message);
}
}
//修改产品信息表数据
async function updateTable() {
try {
console.log("更新数据!")
var sql = "UPDATE production.product SET name = :name " + "WHERE productid = 6;";
// 按名称绑定变量
await conn.execute(sql, { name: { val: "三国演义(上) " } });
await conn.execute("commit;");
} catch (err) {
throw new Error("updateTable error: " + err.message);
}
}
//删除产品信息表数据
async function deleteTable() {
try {
console.log("删除数据!")
var sql = "DELETE FROM production.product WHERE productid = 11;"
await conn.execute(sql);
await conn.execute("commit;");
} catch (err) {
throw new Error("deleteTable error: " + err.message);
}
}
//查询产品信息表
async function queryTable() {
try {
var sql = "SELECT productid,name,author,publisher,photo FROM production.product"
var result = await conn.execute(sql);
var lob = result.rows[result.rows.length - 1][4];
var buffer = await readLob(lob);
// Lob 对象使用完需关闭
await lob.close();
console.log(buffer);
return result;
} catch (err) {
throw new Error("queryTable error: " + err.message);
}
}
//读取数据库返回的 Lob 对象
function readLob(lob) {
return new Promise(function (resolve, reject) {
var blobData = Buffer.alloc(0);
var totalLength = 0;
lob.on('data', function (chunk) {
totalLength += chunk.length;
blobData = Buffer.concat([blobData, chunk], totalLength);
});
lob.on('error', function (err) {
reject(err);
});
lob.on('end', function () {
resolve(blobData);
});
});
}
//结果集方式查询产品信息表
async function queryWithResultSet() {
try {
var sql = "SELECT productid,name,author,publisher FROM production.product";
var result = await conn.execute(sql, [], { resultSet: true });
var resultSet = result.resultSet;
// 从结果集中获取一行
result = await resultSet.getRow();
while (result) {
console.log(result);
result = await resultSet.getRow();
}
} catch (err) {
throw new Error("queryWithResultSet error: " + err.message);
}
}
- 运行代码。
node nodeJsTest.js
- 使用服务名进行连接。
vi /etc/dm_svc.conf
单机环境:
主备环境:
修改对应连接串:
三、Windows 下连接达梦
3.1 开发环境准备
名称 | 版本 |
---|---|
操作系统 | windows10 64 位 |
DM 数据库 | DM 8.0 及以上版本 |
Node.js | 12.18.3 |
3.2 达梦数据库安装
请参考《数据库环境准备》。
3.3 安装 Node.js
- 下载安装包:
- 点击安装包进行安装:
- 安装完成测试:
node -v
3.4 安装 dmdb 包
3.4.1 有网络环境下
使用 npm 命令下载 dmdb 。
npm install dmdb
注意安装部署如有问题参考 https://www.npmjs.com/packagenode-gyp,也可直接使用无网络环境下的离线压缩包安装!
3.4.2 无网络环境下
使用安装包 node_modules_windows.zip ,本安装包是从镜像源 https://registry.npmjs.org/ 下载,window 环境下请使用此压缩包,使用方法为找到 node 安装目录,然后把压缩包解压在安装目录的 node_modules 目录下。
3.5 测试代码编写
- 编写 nodeJsTest.js 文件。代码参考 linux 环境下的代码。
- 运行代码。
node nodeJsTest.js
四、常见问题
4.1 Npm 代理问题
【问题描述】:报错信息如下:
【问题解决】:使用淘宝镜像进行下载。
npm --registry https://registry.npm.taobao.org install dmdb
4.2 安装 dmdb 时报错
【问题描述】:报错信息如下:
【问题解决】:设置 Properly 。
npm config set registry https://registry.npm.taobao.org
4.3 Error: Cannot find module 'dmdb'
【问题描述】:报错信息如下:
【问题解决】:Linux/windows 环境:添加环境变量 NODE_PATH。
五、参考
1.示例代码下载:nodeJsTest.zip 文件。
2.以上文档内容参考过程中遇到任何问题,可到达梦技术社区提问交流。