NestJS动态模块无法注入自定义提供者,求问题排查方案
问题原因
你遇到的依赖解析错误,核心原因是:PermissionGuard依赖的xoxo令牌仅在PermissionModule内部注册,但你只导出了PermissionGuard本身,未将xoxo一并导出。当PermissionTestAppModule导入PermissionModule后,尝试使用PermissionGuard时,Nest会在PermissionTestAppModule的上下文里查找xoxo,但这个令牌只存在于PermissionModule的私有上下文中,导致无法解析依赖。
修复方案
修改permission.module.ts的exports数组,将xoxo也加入导出项,让上层模块能访问到这个依赖:
import { DynamicModule, Module } from '@nestjs/common' import { PermissionGuard } from './guard/permission.guard' @Module({}) export class PermissionModule { public static forRoot(config: { text: string }): DynamicModule { return { module: PermissionModule, providers: [ { provide: 'xoxo', useValue: config.text, }, PermissionGuard, ], // 同时导出PermissionGuard和它的依赖xoxo exports: [PermissionGuard, 'xoxo'], } } }
更规范的优化建议
为了避免字符串令牌的拼写错误,建议定义一个常量作为注入令牌:
// permission.constants.ts export const PERMISSION_CONFIG = 'PERMISSION_CONFIG';
然后在permission.module.ts和permission.guard.ts中使用这个常量:
// permission.module.ts import { DynamicModule, Module } from '@nestjs/common' import { PermissionGuard } from './guard/permission.guard' import { PERMISSION_CONFIG } from './permission.constants' @Module({}) export class PermissionModule { public static forRoot(config: { text: string }): DynamicModule { return { module: PermissionModule, providers: [ { provide: PERMISSION_CONFIG, useValue: config.text, }, PermissionGuard, ], exports: [PermissionGuard, PERMISSION_CONFIG], } } }
// permission.guard.ts import { CanActivate, ExecutionContext, Inject, Injectable, } from '@nestjs/common' import { PERMISSION_CONFIG } from '../permission.constants' @Injectable() export class PermissionGuard implements CanActivate { constructor(@Inject(PERMISSION_CONFIG) private readonly config: string) {} async canActivate(context: ExecutionContext): Promise<boolean> { console.log(31, this.config) return true } }
这样能有效避免因字符串拼写错误导致的依赖解析问题,同时让代码更具可维护性。
内容的提问来源于stack exchange,提问作者redism
相关产品推荐
相关产品推荐

