如何在TypeORM中使用async/await+try/catch且无需手动抛错进入catch块?
解决TypeORM中未找到实体时自动进入catch块的问题
嘿,我完全懂你遇到的这个困扰!TypeORM的findOneById(现在更推荐用findOneBy({ id }))默认设计就是在找不到匹配实体时返回undefined,而不是抛出错误,所以你的try/catch自然不会触发。不过确实有无需手动抛错的方法,用TypeORM官方提供的findOneOrFail就可以搞定!
直接使用findOneOrFail方法
findOneOrFail是TypeORM专门为这种场景设计的方法:当查询不到对应实体时,它会自动抛出EntityNotFoundError,这样你的try/catch就能直接捕获到这个错误,不用手动写throw Error()了。
修改后的代码示例:
let user; try { // 替换findOneById为findOneOrFail,参数写法和findOneById一致 user = await findOneOrFail(id); } catch (err) { // 这里会捕获到EntityNotFoundError,或者其他可能的数据库异常 console.log(err); // 还可以针对性处理这个特定错误 if (err.name === 'EntityNotFoundError') { console.log('用户不存在'); } } return user;
补充说明
findOneOrFail不仅支持按ID查询,也支持和findOne一样的查询条件,比如findOneOrFail({ where: { email: 'xxx@example.com' } })- 如果你用的是较新版本的TypeORM,
findOneById已经被标记为废弃,建议改用findOneBy({ id })或者findOneOrFail({ where: { id } }) - 捕获到的
EntityNotFoundError是TypeORM的内置错误类型,你可以通过err.name或者直接导入这个错误类来做精准判断,让错误处理更清晰
内容的提问来源于stack exchange,提问作者D. Vader
相关产品推荐
相关产品推荐

