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

Express中getOne接口请求MongoDB无数据且陷入无限循环问题排查

问题排查:Express + MongoDB 接口无限循环且无数据返回

问题场景

使用Express开发时,通过Postman向getTourById接口(基于getOne工厂函数实现)发送GET请求,出现MongoDB无数据返回且请求陷入无限循环的问题,调整控制器代码后未解决。

相关代码

factory.js

exports.getOne = (Model, popOptions) =>
  catchAsync(async (req, res, next) => {
    console.log('GET ONE');
    let query = Model.findById(req.params.id);
    if (popOptions) query = query.populate(popOptions);
    const doc = await query;
    if (!doc) {
      return next(
        new AppError('No documents fond with that id', 404)
      );
    }
    res.status(200).json({
      status: 'success',
      data: {
        data: doc,
      },
    });
  });

控制器代码

exports.getTourById = factory.getOne(Tour, { path: 'reviews' });

排查方向

  • 循环引用导致无限填充:检查Tour与Review模型的关联配置。如果Review模型中也配置了关联Tour且查询时自动填充Tour,那么getTourById填充reviews时,每个review会反向填充tour,而该tour又会再次填充reviews,形成无限循环,导致请求无法结束、数据无法返回。
  • 请求ID不匹配:核对Postman请求中传入的id是否与MongoDB中Tour文档的_id完全一致(MongoDB的_id为ObjectId类型,字符串格式需完全匹配,包括大小写),确认参数ID是否存在于数据库中。
  • catchAsync函数异常:检查catchAsync的实现是否正确捕获异步错误并传递给next(),若错误未被正确处理,可能导致请求挂起,表现为无限循环。
  • 填充配置错误:确认popOptions中的path: 'reviews'与Tour模型中定义的关联字段名完全一致(字段名大小写敏感),拼写错误或关联配置异常会导致填充失败,甚至引发请求卡住。

内容的提问来源于stack exchange,提问作者devoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:17:08