You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:12:46