使用@nestjs/typeorm的findOne查询Mongo文档返回null求助
问题分析与解决
你遇到的问题核心在于MongoDB存储的id是ObjectID类型,但你传入的查询参数是字符串,直接匹配会失败,另外代码里还有两处小问题需要修正。
具体修复步骤
1. 转换字符串ID为ObjectID
MongoDB的_id(对应你实体里的id)是ObjectID对象,不是纯字符串。查询时需要把传入的字符串ID转换成ObjectID类型才能匹配。
首先确保导入TypeORM的ObjectID:
import { ObjectID } from 'typeorm';
2. 修正Service层的查询逻辑
修改findOne方法,将字符串ID转为ObjectID,同时修正错误提示信息(原错误信息"Email is already in use"完全不相关):
async findOne(id: string) { try { // 把字符串ID转为ObjectID const objectId = new ObjectID(id); // 直接传入ID给findOne,或者用where条件 const results = await this.itemsRepository.findOne(objectId); if (!results) throw new Error('Item not found'); return results; } catch (error) { console.log('Error ===', error); throw error; // 抛出错误让上层处理,比如GraphQL返回错误信息 } }
3. 修正Repository实例名称
你的Service里写的是this.destinationsRepository,但实体是Item,应该改为this.itemsRepository,避免调用错误的Repository实例。
额外注意点
- 确保传入的ID是有效的MongoDB ObjectID格式,否则转换时会报错,可以在Resolver层先做格式校验。
- TypeORM针对MongoDB的
findOne方法支持直接传入ObjectID作为参数,写法比where条件更简洁。
内容的提问来源于stack exchange,提问作者bryan edward
相关产品推荐
相关产品推荐

