如何在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
相关产品推荐
相关产品推荐

