NestJS中如何在databaseProviders外访问Sequelize执行原生查询
完全可以在该配置文件外部访问Sequelize实例执行原生查询,你当前的写法已经把实例注册到了NestJS的依赖注入容器中,直接通过内置装饰器就可以获取实例,具体用法如下:
1. 核心获取方式:@Inject()装饰器注入
你在provider中指定了注入token为字符串'Sequelize',所有被NestJS容器托管的类(Service、Resolver、Guard等)都可以通过构造函数注入拿到实例,示例代码如下:
import { Injectable, Inject } from '@nestjs/common'; import { Sequelize } from 'sequelize-typescript'; // 替换为你项目实际的Sequelize引入路径 @Injectable() export class DemoService { constructor( // 注入token必须和你provider里写的provide值完全一致 @Inject('Sequelize') private readonly sequelize: Sequelize, ) {} async executeRawSql() { // 拿到实例后直接调用query方法执行原生查询 const [queryResult] = await this.sequelize.query( 'SELECT id, order_no FROM orders WHERE create_time > :startTime', { replacements: { startTime: '2024-01-01' }, raw: true, } ); return queryResult; } }
2. 必要配置:确保Provider被模块导出
要让其他模块能注入到这个Sequelize实例,你存放databaseProviders的模块必须把该provider导出,示例模块代码:
import { Module } from '@nestjs/common'; import { databaseProviders } from './database.providers'; @Module({ providers: [...databaseProviders], // 必须加exports配置,外部模块才能访问该provider exports: [...databaseProviders], }) export class DatabaseModule {}
之后在需要使用Sequelize实例的业务模块中,引入上述DatabaseModule即可正常注入。
3. 特殊场景说明
如果是在脱离NestJS依赖注入体系的独立脚本中(比如一次性数据修复脚本、初始化脚本),可以直接手动调用provider里的工厂函数获取实例,但不推荐在常规业务代码中用这种方式,会绕开容器的生命周期管理,容易产生重复数据库连接、连接未释放等问题。
另外如果担心字符串token容易拼写错误,可以把token抽成全局常量统一引用,避免出现注入失败的问题。
内容的提问来源于stack exchange,提问作者Mukesh Kashyap
相关产品推荐
相关产品推荐

