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
相关产品推荐
相关产品推荐

