You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NestJS应用中正确定义与配置Drizzle ORM

解决NestJS中Drizzle ORM模块、服务与员工模块的规范配置

一、修正AppModule配置问题

你当前的AppModule错误地将EmployeesService注册在根模块的providers中,正确的做法是让EmployeesModule自行管理内部服务,根模块仅需导入子模块即可。修改后的app.module.ts:

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DrizzleMySqlModule } from '@knaadh/nestjs-drizzle-mysql2';
import * as schema from './drizzle/models/employees.entity';
import { EmployeesModule } from './employees/employees.module';
import { TeamsModule } from './teams/teams.module';
import { ReportsModule } from './reports/reports.module';

@Module({
  imports: [
    DrizzleMySqlModule.register({
      mysql: {
        connection: 'pool',
        config: {
          host: '127.0.0.1',
          user: 'xxxx',
          password: '你的数据库密码', // 补充缺失的密码配置
          database: 'partner2learn',
        },
      },
      config: { schema: { ...schema }, mode: 'default' },
    }),
    EmployeesModule,
    TeamsModule,
    ReportsModule,
  ],
  controllers: [AppController],
  providers: [AppService], // 移除EmployeesService,交由EmployeesModule管理
})
export class AppModule {} 

二、Drizzle相关配置(官方包/自定义二选一)

方案1:直接使用官方封装的@knaadh/nestjs-drizzle-mysql2

该包已封装好模块与提供者,无需自行编写drizzle.module.ts和drizzle.provider.ts,直接在子模块中导入即可使用。

方案2:自定义Drizzle模块(可选)

如果需要更灵活的控制,可以手动封装:

1. Drizzle提供者(drizzle/drizzle.provider.ts)

import { Provider } from '@nestjs/common';
import { createPool } from 'mysql2/promise';
import { drizzle } from 'drizzle-orm/mysql2';
import * as schema from './models/employees.entity';

export const DRIZZLE_DB = 'DRIZZLE_DB';

export const DrizzleProvider: Provider = {
  provide: DRIZZLE_DB,
  useFactory: async () => {
    const pool = await createPool({
      host: '127.0.0.1',
      user: 'xxxx',
      password: '你的数据库密码',
      database: 'partner2learn',
    });
    return drizzle(pool, { schema, mode: 'default' });
  },
};

2. Drizzle模块(drizzle/drizzle.module.ts)

import { Module } from '@nestjs/common';
import { DrizzleProvider } from './drizzle.provider';

@Module({
  providers: [DrizzleProvider],
  exports: [DrizzleProvider], // 导出提供者,供其他模块注入使用
})
export class DrizzleModule {}

3. 通用Drizzle服务(drizzle/drizzle.service.ts,可选)

封装通用数据库操作,避免重复代码:

import { Inject, Injectable } from '@nestjs/common';
import { DRIZZLE_DB } from './drizzle.provider';
import { MySql2Database } from 'drizzle-orm/mysql2';
import * as schema from './models/employees.entity';

@Injectable()
export class DrizzleService {
  constructor(
    @Inject(DRIZZLE_DB) private readonly db: MySql2Database<typeof schema>,
  ) {}

  // 封装通用查询方法
  async findAll<T>(table: any) {
    return this.db.select().from(table);
  }

  // 可扩展更多CRUD通用方法
}

使用自定义模块时,需在AppModule中导入DrizzleModule替代官方的DrizzleMySqlModule。

三、员工模块与服务规范配置

1. EmployeesModule(employees/employees.module.ts)

import { Module } from '@nestjs/common';
import { EmployeesService } from './employees.service';
import { EmployeesController } from './employees.controller'; // 建议添加控制器对外提供接口
// 用官方包则导入DrizzleMySqlModule,用自定义则导入DrizzleModule
import { DrizzleMySqlModule } from '@knaadh/nestjs-drizzle-mysql2';

@Module({
  imports: [DrizzleMySqlModule], // 导入Drizzle模块,使内部服务可注入DB实例
  providers: [EmployeesService],
  controllers: [EmployeesController], // 对外暴露接口用
  exports: [EmployeesService], // 若其他模块需调用此服务则导出
})
export class EmployeesModule {}

2. 修正后的EmployeesService(employees/employees.service.ts)

使用官方包时,注入DB实例的token为DRIZZLE_MYSQL_CONNECTION,同时修正变量名错误:

import { Inject, Injectable } from '@nestjs/common';
import { DRIZZLE_MYSQL_CONNECTION } from '@knaadh/nestjs-drizzle-mysql2';
import * as schema from '../drizzle/models/employees.entity';
import { MySql2Database } from 'drizzle-orm/mysql2';

@Injectable()
export class EmployeesService {
  constructor(
    @Inject(DRIZZLE_MYSQL_CONNECTION) private readonly db: MySql2Database<typeof schema>,
  ) {}

  async getData() {
    const employees = await this.db.query.employees.findMany();
    return { employees };
  }
}

3. 可选:EmployeesController(employees/employees.controller.ts)

import { Controller, Get } from '@nestjs/common';
import { EmployeesService } from './employees.service';

@Controller('employees')
export class EmployeesController {
  constructor(private readonly employeesService: EmployeesService) {}

  @Get()
  async getEmployees() {
    return this.employeesService.getData();
  }
}

四、关键注意事项

  • 子模块的服务不要注册在根模块providers中,由子模块自行管理
  • 使用官方包时,必须使用DRIZZLE_MYSQL_CONNECTION作为注入token,不能留空
  • 数据库配置必须补全密码,否则无法建立连接
  • 变量名需保持一致,避免出现books和employees不匹配的低级错误

内容的提问来源于stack exchange,提问作者Don

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:00:34