还在为国产化项目里NestJS连不上达梦发愁?网上搜到的方案要么版本太旧,要么踩坑没人填?试了一下午,换了三个方言包,终于跑通了!

今天把这份 “保姆级教程+可运行代码” 全部分享出来,包含环境搭建、依赖安装、CRUD完整实现、常见报错解决方案。只要你跟着敲,10分钟就能让你的NestJS项目顺畅操作达梦数据库!

先看看你能收获什么

  • ✅ 最稳的方言包组合typeorm-dm + dmdb,经过Node 16/18实测。

  • ✅ 纯JavaScript可运行脚本:不依赖NestJS框架,新建一个ts.js就能测通。

  • ✅ 完整的用户表增删改查:复制即用,快速验证你的数据库连接。

  • ✅ 5个最常见的报错解法:从MODULE_NOT_FOUND到加密失败,一网打尽。

如果你觉得有用,记得点赞👍、收藏🌟、评论💬支持一下!你的鼓励是我分享更多实战干货的动力~


1. 先搞清楚:NestJS + ORM + 达梦 = 国产化项目标配

随着国产化进程加速,达梦数据库在政府、金融、能源等行业的项目中越来越常见。NestJS 作为企业级 Node.js 框架,搭配 TypeORM 这样的成熟 ORM,能极大提升开发效率和代码可维护性。

核心原理(为什么能连?)

  • NestJS 不直接实现 ORM,而是通过依赖注入和模块化设计,无缝集成 TypeORM、Prisma 等工具。

  • TypeORM 本身不原生支持达梦,但社区开发了专门的“方言包”(如 typeorm-dm@newpower/typeorm-dmdb8),它们在 TypeORM 核心基础上,增加了达梦数据库的数据类型映射、SQL 方言转换和驱动适配。

  • 这些方言包通常配合达梦官方 Node.js 驱动 dmdb 一起使用,通过 type: "oracle" 和 innerType: "dmdb" 等配置项来激活达梦支持。

2. 环境准备与方案选型

在开始之前,确保你的开发环境满足以下条件:

  • Node.js:推荐使用 16.x 或 18.x LTS 版本。高版本(如 20+、24+)可能与 dmdb 驱动存在兼容性问题。

  • 达梦数据库:已安装并运行,知道连接地址、端口(默认 5236)、用户名、密码和模式名(Schema)。

  • NestJS 项目:已通过 @nestjs/cli 创建好的基础项目。

两种主流方言包对比

方言包 安装命令 特点
typeorm-dm npm install typeorm-dm dmdb 社区使用较广,文档相对丰富,与 typeorm@0.3.x 兼容性好
@newpower/typeorm-dmdb8 npm install @newpower/typeorm-dmdb8 dmdb 基于 typeorm@0.3.26 定制,维护活跃

本文将以 typeorm-dm 为例,因为它在解决依赖冲突方面更稳定,也是我最终成功连接的方案。

3. 环境准备(看完再动手,少踩一半坑)

  • Node.js版本:推荐 16.x 或 18.x LTS(亲测最稳,高版本可能遇到驱动编译问题)

  • 达梦数据库:已安装,知道IP、端口(默认5236)、用户名、密码、模式名(Schema)

  • 编辑器:VSCode或其他,新建一个空文件夹即可,不需要NestJS项目结构

📢 如果你用的是Node 20+,后面遇到加密错误不要慌,文末有解决方案。


4. 依赖安装(一步都不能错)

打开终端,进入你的空文件夹,执行:

bash

npm install typeorm-dm dmdb reflect-metadata

安装完后,可以检查一下package.json,确保typeorm的版本是^0.3.x。如果之前装过其他方言包,先删掉node_modulespackage-lock.json再装。


5. 定义用户实体(纯JS友好版)

新建user.entity.js,复制以下代码:

javascript

const { EntitySchema } = require('typeorm');

module.exports = new EntitySchema({
    name: 'User',
    tableName: 'T_USER',
    columns: {
        id: {
            primary: true,
            type: 'int',
            generated: true,      // 自增主键
        },
        name: {
            type: 'varchar',
            length: 50,
        },
        age: {
            type: 'int',
            nullable: true,
        },
    },
});

6. 完整CRUD测试脚本(ts.js)

创建ts.js,将下面的代码复制进去,务必修改数据库连接参数(用户名、密码、schema):

javascript


const { DmdbDataSource } = require('typeorm-dm');
require('reflect-metadata');
const UserEntity = require('./user.entity'); // 引入实体定义

const AppDataSource = new DmdbDataSource({
    type: "oracle",
    innerType: "dmdb",
    host: "localhost",
    port: 5236,
    username: "SYSDBA",
    password: "aaaa123456",
    schema: "DMTEST",
    entities: [UserEntity],        // 注册实体
    synchronize: true,              // 开发环境自动创建表(生产环境慎用)
    logging: false,
    extra: {
        connectTimeout: 30000,
    }
});

async function run() {
    try {
        await AppDataSource.initialize();
        console.log("✅ 数据库连接成功");

        // 获取 User 的 Repository
        const userRepo = AppDataSource.getRepository('User');

        // 插入一条数据
        let newUser = await userRepo.save({ name: '张三', age: 30 });
        console.log("✅ 插入成功,ID:", newUser.id);

        newUser = await userRepo.save({ name: '李四', age: 40 });
        console.log("✅ 插入成功,ID:", newUser.id);

        newUser = await userRepo.save({ name: '王五', age: 50 });
        console.log("✅ 插入成功,ID:", newUser.id);


        // 查询所有用户
        const users = await userRepo.find();
        console.log("✅ 用户列表:", users);

        await AppDataSource.destroy();
    } catch (error) {
        console.error("❌ 操作失败:", error.message);
    }
}

run();

7. 运行测试

bash

 

node ts.js

如果一切顺利,你会看到类似下面的输出:

 

查看dm数据库

恭喜!你已经成功用Node.js操作了达梦数据库! 🎉

8. 常见问题 & 解决方案(建议收藏)

❌ 问题1:Error: Cannot find module 'typeorm-dm'

原因:未安装typeorm-dm
解决:执行npm install typeorm-dm,并确认node_modules里有该包。

❌ 问题2:TypeError: DmdbDataSource is not a constructor

原因:导入方式错误,该包是命名导出
解决:使用const { DmdbDataSource } = require('typeorm-dm');(注意花括号)

❌ 问题3:DriverPackageNotInstalledError: Oracle package not found

原因:未安装dmdb驱动,或innerType配置未生效
解决:安装dmdbnpm install dmdb,并检查配置中innerType: "dmdb"是否正确。

❌ 问题4:连接时报 [6071] 消息加密失败

原因:加密参数不匹配
解决:在extra中添加loginEncrypt: false,如下:

javascript

extra: {
    loginEncrypt: false,
}

❌ 问题5:Node版本过高,编译失败

原因:达梦驱动对高版本Node支持不完善
解决:降级到Node 16或18(推荐使用nvm管理版本)

 

 

如果你觉得有用,记得点赞👍、收藏🌟、评论💬支持一下!你的鼓励是我分享更多实战干货的动力~

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐