如何在NestJS中正确集成mssql数据库连接库?
NestJS 中使用 mssql 库的最佳实践解答
单例实现方案:推荐自定义模块
这是 NestJS 官方推荐的第三方服务集成方式,天然支持单例,不需要额外手动维护单例逻辑,扩展性和可维护性都更高。
实现思路如下:
- 首先安装必要依赖:
npm install mssql @nestjs/config - 新建全局 mssql 动态模块,路径
src/mssql/mssql.module.ts:
import { Module, DynamicModule, Global } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import * as sql from 'mssql'; @Global() // 标记为全局模块,避免各业务模块重复导入 @Module({}) export class MssqlModule { static forRoot(): DynamicModule { const mssqlProvider = { provide: 'MSSQL_CONNECTION_POOL', useFactory: async (configService: ConfigService) => { // 初始化连接池,整个应用生命周期只会初始化一次 return await sql.connect({ user: configService.get<string>('MSSQL_USER'), password: configService.get<string>('MSSQL_PASSWORD'), server: configService.get<string>('MSSQL_HOST'), database: configService.get<string>('MSSQL_DATABASE'), options: { encrypt: configService.get<boolean>('MSSQL_ENCRYPT', false), trustServerCertificate: configService.get<boolean>('MSSQL_TRUST_CERT', true) } }); }, inject: [ConfigService] }; return { module: MssqlModule, imports: [ConfigModule], providers: [mssqlProvider], exports: [mssqlProvider] }; } }
- 在根模块
AppModule中注册模块:
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { MssqlModule } from './mssql/mssql.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), // 加载.env环境变量 MssqlModule.forRoot() ] }) export class AppModule {}
- 业务服务中直接注入连接池使用即可:
import { Injectable, Inject } from '@nestjs/common'; import * as sql from 'mssql'; @Injectable() export class UserService { constructor(@Inject('MSSQL_CONNECTION_POOL') private readonly mssqlPool: sql.ConnectionPool) {} async listUsers() { const queryResult = await this.mssqlPool.request().query('SELECT id, name FROM users'); return queryResult.recordset; } }
如果你的项目规模很小,不想封装独立模块,也可以直接在AppModule的providers里定义mssql连接的provider,本质逻辑和上面一致,只是复用性更低。
关于mssql依赖axios的审计漏洞
不需要过度紧张,可按实际场景判断处理:
- 首先确认漏洞触发路径:mssql 只有在使用 Azure SQL 相关的云服务功能(比如 Azure 身份验证、弹性池管理)时才会调用 axios,如果你完全没有用到这类功能,漏洞没有触发路径,不会对项目产生影响。
- 如果你的项目确实用到了相关功能,或者漏洞属于高危远程执行类漏洞,可以通过 npm overrides 强制指定 axios 安全版本,在
package.json中添加如下配置即可,不会影响mssql的正常使用:
{ "overrides": { "mssql": { "axios": "^1.7.4" // 替换为对应漏洞的修复版本号即可 } } }
注意:大部分 npm audit 报出的间接依赖漏洞都没有实际触达路径,不要盲目升级,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者LMinato
相关产品推荐
相关产品推荐

