使用Mongoose的findById无法获取完整文档的问题求助
问题排查与解决
哦,我一眼就揪出问题所在了!你在Article.findById()里传的第二个参数'keyskeys'是无效的**字段投影(field projection)**值,这就是为什么接口只返回_id字段的核心原因。
为什么会这样?
Mongoose的findById()方法第二个参数是用来指定要返回哪些字段的。如果传入一个不存在的字段名(或者像你这样的无效字符串),Mongoose会默认只返回_id字段,其他所有字段都会被过滤掉,这就导致你拿到的只有文章ID,没有其他内容。
修复方案
根据你的需求,这里有几种处理方式:
- 返回所有字段(推荐,符合你的需求)
直接去掉那个无效的'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 }); }); });
- 指定返回特定字段
如果之后你需要只返回部分字段,比如title、body和user,可以传正确的字段名列表:
Article.findById(req.params.articleId, 'title body user') .populate('user') .exec(/* ... */)
- 排除特定字段
要是想去掉某个不需要的字段(比如__v版本号),可以在字段名前加-:
Article.findById(req.params.articleId, '-__v') .populate('user') .exec(/* ... */)
额外优化建议
顺便提一句,当文章找不到时,你返回的500状态码不太合适——500是服务器内部错误,找不到资源应该用404 Not Found,我上面的修复代码已经帮你改过来了,更符合HTTP规范。
内容的提问来源于stack exchange,提问作者yemiOdetola
相关产品推荐
相关产品推荐

