Repository类触发Unhandled Promise Rejection Warning问题求解
报错原因
- 核心原因是异步Promise的异常没有被捕获:
CreateMemberController的executeImpl方法调用异步方法add时未添加await关键字。async方法返回的是Promise对象,未用await等待的情况下,该Promise的reject状态不会被外层的try/catch逻辑捕获,没有处理的Promise拒绝就会抛出UnhandledPromiseRejectionWarning警告。- 额外隐患:
MemberRepository的add方法中调用userRepository.save()时也未添加await,save是TypeORM提供的异步数据库操作方法,未等待的情况下如果save执行报错,异常不会被当前方法的try/catch捕获,会直接向上抛出。
修复方案
- 给Controller中的
add调用添加await,让外层try/catch可以正常捕获异步异常:
// 修正后的CreateMemberController部分代码 protected async executeImpl( request: express.Request, response: express.Response ): Promise<void | any> { try { const member = new Member(); member.firstName = firstName; // 新增await关键字 let user = await this.memberrRepo.add(member); } catch (error) { console.error(error); } }
- 给
MemberRepository中的save调用添加await,确保数据库操作异常能被当前方法的try/catch捕获,同时优化错误抛出逻辑,保留原始错误信息方便排查:
// 修正后的MemberRepository部分代码 async add(model: Member): Promise<Member | null> { try { const userRepository = getRepository(Member); // 新增await关键字 const savedUser = await userRepository.save(model); return savedUser; } catch (e) { // 替换原有返回Promise.reject的逻辑,async方法内抛错会自动包装为rejected Promise,同时保留错误信息 throw new Error(`会员保存失败: ${e instanceof Error ? e.message : '未知错误'}`); } }
内容的提问来源于stack exchange,提问作者Kasun Wickramanayake
相关产品推荐
相关产品推荐

