使用Router.put查询用户位置时MongoDB find方法报错求助
问题分析与解决方案
嘿,我一眼就看出问题所在啦!你遇到的“无法设置null属性”报错,核心原因是**User.find()和User.findById()的返回值类型不一样**:
User.findById()返回的是单个匹配的文档对象,所以你可以直接调用它的save()方法,操作属性也没问题。- 但
User.find()返回的是匹配结果的数组——哪怕数据库里只有一个对应手机号的用户,它也会把结果包在数组里返回。你直接给user.name赋值,本质是给数组加属性,完全不符合预期;如果没找到用户,user就是空数组,后续调用user.save()自然会报错(因为数组根本没有save方法)。
修正方案(两种可选)
方案1:用User.findOne()替代User.find()
findOne()会直接返回第一个匹配的文档对象,用法和find()几乎一致,是最适合你场景的选择:
router.put('/updatelocation/:mobileNo', (req, res) => { User.findOne({ mobileNo: req.params.mobileNo }, (err, user) => { if (err) { return res.send(err); // 加return避免后续代码重复响应 } // 先判断是否找到用户,避免操作undefined if (!user) { return res.json({ message: '未找到该手机号对应的用户' }); } user.name = req.body.name; user.save(function(err) { if (err) { return res.send(err); } res.json({ message: 'Food Truck info updated' }); }); }); });
方案2:如果坚持用User.find(),需从数组中取元素
如果你一定要保留find(),记得从返回的数组里取出第一个匹配项再操作:
router.put('/updatelocation/:mobileNo', (req, res) => { User.find({ mobileNo: req.params.mobileNo }, (err, users) => { if (err) { return res.send(err); } // 检查数组是否为空 if (users.length === 0) { return res.json({ message: '未找到该手机号对应的用户' }); } const user = users[0]; // 取出第一个用户文档 user.name = req.body.name; user.save(function(err) { if (err) { return res.send(err); } res.json({ message: 'Food Truck info updated' }); }); }); });
额外优化建议
如果你的项目允许,建议换成async/await风格的代码,可读性会更高,也更容易处理错误:
router.put('/updatelocation/:mobileNo', async (req, res) => { try { const user = await User.findOne({ mobileNo: req.params.mobileNo }); if (!user) { return res.json({ message: '未找到该手机号对应的用户' }); } user.name = req.body.name; await user.save(); res.json({ message: 'Food Truck info updated' }); } catch (err) { res.send(err); } });
内容的提问来源于stack exchange,提问作者user2276821
相关产品推荐
相关产品推荐

