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

使用Mongoose的findById无法获取完整文档的问题求助

问题排查与解决

哦,我一眼就揪出问题所在了!你在Article.findById()里传的第二个参数'keyskeys'是无效的**字段投影(field projection)**值,这就是为什么接口只返回_id字段的核心原因。

为什么会这样?

Mongoose的findById()方法第二个参数是用来指定要返回哪些字段的。如果传入一个不存在的字段名(或者像你这样的无效字符串),Mongoose会默认只返回_id字段,其他所有字段都会被过滤掉,这就导致你拿到的只有文章ID,没有其他内容。

修复方案

根据你的需求,这里有几种处理方式:

  1. 返回所有字段(推荐,符合你的需求)
    直接去掉那个无效的'keyskeys'参数,这样Mongoose就会返回文档的所有字段:
router.get('/:articleId', function (req, res, next) { 
  var decoded = jwt.decode(req.query.token); 
  Article.findById(req.params.articleId) 
    .populate('user') 
    .exec( function (err, article) { 
      console.log('see out article too', article) 
      // if the ID is not found or invalid, return err 
      if (err) { 
        return res.status(500).json({ title: 'An error occured', error: err }); 
      } 
      // if the article was not found anyways 
      if (!article) { 
        return res.status(404).json({ title: 'Article not found', error: { message: 'Article was not found!' } }); 
      } 
      return res.json({ success: true, message: 'successful :id', article: article }); 
    }); 
});
  1. 指定返回特定字段
    如果之后你需要只返回部分字段,比如title、body和user,可以传正确的字段名列表:
Article.findById(req.params.articleId, 'title body user')
  .populate('user')
  .exec(/* ... */)
  1. 排除特定字段
    要是想去掉某个不需要的字段(比如__v版本号),可以在字段名前加-:
Article.findById(req.params.articleId, '-__v')
  .populate('user')
  .exec(/* ... */)

额外优化建议

顺便提一句,当文章找不到时,你返回的500状态码不太合适——500是服务器内部错误,找不到资源应该用404 Not Found,我上面的修复代码已经帮你改过来了,更符合HTTP规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:35:09