从NestJS应用上下文获取服务时注入依赖项未定义
问题分析与解决方案
核心原因
你的PatientService中注入了@Inject(REQUEST)对象,但在NestJS独立应用模式下,不存在HTTP请求上下文,导致REQUEST无法被正常注入,进而引发整个服务的依赖注入流程异常,最终patientRepository未完成初始化,调用findOneByOrFail时出现Cannot read properties of undefined (reading 'findOneByOrFail')错误。
另外还有参数匹配问题:findOne方法定义接收的是id: string类型参数,但你调用时传入的是对象{ id: addedPerson.id },这会导致方法内部的{ id }解构实际拿到undefined,即使依赖注入正常,也会查询失败。
解决方案
1. 处理REQUEST依赖问题
根据你的使用场景选择以下方案:
方案A:独立运行时模拟REQUEST对象
如果只是临时在独立脚本中调用服务,且当前场景不需要用到REQUEST的实际数据,可以在获取服务时手动提供REQUEST的模拟值:
const patientService = app.select(PatientModule).get(PatientService, { strict: true, context: { REQUEST: {} // 按需添加必要的request属性,比如headers、user等 } });
方案B:将REQUEST设为可选注入
如果REQUEST并非服务运行的必要依赖,可以修改PatientService的构造函数,把REQUEST标记为可选:
constructor( @InjectRepository(Patient) private patientRepository: Repository<Patient>, @Inject(REQUEST) private readonly request?: Request, // 添加?符号设为可选 ) {}
方案C:重构依赖REQUEST的逻辑
如果服务中确实需要使用请求相关逻辑,建议把依赖REQUEST的代码抽离成单独的方法或服务,在独立运行时手动传入上下文数据,避免直接依赖REQUEST对象。
2. 修正findOne调用参数
将调用时的对象参数改为直接传入id值:
const doctor = await patientService.findOne(addedPerson.id);
内容的提问来源于stack exchange,提问作者Mojtaba
相关产品推荐
相关产品推荐

