MongoDB查询返回数据异常求助:无法正确获取文档字段值
解决Mongoose查询后字段无法赋值的问题
嗨,我来帮你搞定这个问题~你现在遇到的核心问题是Mongoose的数据库查询是异步操作,你直接用Post.find(...)拿到的不是实际的文档数据,而是一个Query对象——这就好比你点了外卖,刚下单就想去拿餐,餐还没做好呢,自然拿不到东西。
所以你直接访问myobj.title这些属性时,它们都是undefined,JSON序列化的时候就被自动忽略了,最后就只剩你手动写的id:1啦。
下面给你两种常用的解决办法,选你顺手的来:
方法一:用async/await(推荐,代码更简洁)
把路由处理函数改成异步函数,用await等待查询完成,这样就能拿到真实的文档数据了。另外,因为find()返回的是数组(哪怕你加了limit(1)),所以要取数组的第一个元素;或者直接用findOne(),它会直接返回单个文档,更省事:
用findOne的版本(更推荐)
app.get("/api/solutions", async (req, res) => { // 等待查询完成,获取最新的一条数据 const myobj = await Post.findOne().sort({_id: -1}); // 构造返回的数组,用可选链?.避免万一没查到数据时报错 const solutions = [ { id: 1, title: myobj?.title, subTitle: myobj?.slogan, description: myobj?.description }, ] res.json(solutions); });
用find的版本
app.get("/api/solutions", async (req, res) => { // find返回数组,取第一个元素 const results = await Post.find().sort({_id: -1}).limit(1); const myobj = results[0]; const solutions = [ { id: 1, title: myobj?.title, subTitle: myobj?.slogan, description: myobj?.description }, ] res.json(solutions); });
方法二:用Promise的then回调
如果你还不太习惯async/await,用传统的then回调也能解决:
app.get("/api/solutions", (req, res) => { Post.find().sort({_id: -1}).limit(1) .then(results => { const myobj = results[0]; const solutions = [ { id: 1, title: myobj?.title, subTitle: myobj?.slogan, description: myobj?.description }, ] res.json(solutions); }) // 别忘了处理查询可能出现的错误哦 .catch(err => { res.status(500).json({error: "查询失败", details: err.message}); }); });
额外小提示
不管用哪种方法,最好加上错误处理,比如用try/catch包裹async/await的代码,避免数据库出错时服务器崩溃:
app.get("/api/solutions", async (req, res) => { try { const myobj = await Post.findOne().sort({_id: -1}); const solutions = [ { id: 1, title: myobj?.title, subTitle: myobj?.slogan, description: myobj?.description }, ] res.json(solutions); } catch (err) { res.status(500).json({error: "查询数据失败", message: err.message}); } });
内容的提问来源于stack exchange,提问作者vrto95
相关产品推荐
相关产品推荐

