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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:48:03