Express中MongoDB查询对象isAdmin属性存在但取值为undefined问题
问题解决:Mongoose查询结果无法访问isAdmin属性
可能原因1:User模型Schema未定义isAdmin字段
Mongoose会严格按照Schema定义的字段映射数据,如果你的User模型Schema里没有声明isAdmin字段,即使MongoDB集合里存在该字段,Mongoose也不会将其加载到返回的Document对象中,导致直接访问response.isAdmin得到undefined。
解决办法:检查并更新User模型的Schema,添加isAdmin字段定义:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ userName: String, userId: String, comment: String, isAdmin: Boolean // 必须添加该字段声明 }); const User = mongoose.model('User', userSchema);
可能原因2:Mongoose Document对象需转为普通JS对象
Mongoose查询返回的是Document实例,并非普通JavaScript对象,部分属性可能无法直接通过点语法访问。你可以通过以下两种方式处理:
方法1:使用toObject()转换为普通对象
User.findById(mongoose.Types.ObjectId(req.body.uid._id)).then(response => { const userObj = response.toObject(); console.log(userObj.isAdmin); // 可正常获取属性值 if(userObj.isAdmin === true) { res.json({ authorized: true, result: userObj, message: 'User Authorized' }) } else { res.json({ authorized: false, message:'User not authorized' }) } })
方法2:使用Mongoose的get()方法获取属性
console.log(response.get('isAdmin')); // 通过get方法直接读取字段值
异步代码优化(可选)
你的代码使用了async函数却嵌套了then,可以改用await语法让代码更简洁易读:
app.post("/api/validate", async (req,res) => { console.log('validating with id -> ', req.body.uid._id) try { const user = await User.findById(mongoose.Types.ObjectId(req.body.uid._id)); if(!user) { return res.json({ message: 'User not found.' }); } const isAdmin = user.toObject().isAdmin; res.json({ authorized: isAdmin === true, result: user, message: isAdmin ? 'User Authorized' : 'User not authorized' }); } catch (error) { res.json({ message: 'User not found.', err: error }) } })
内容的提问来源于stack exchange,提问作者mikeym
相关产品推荐
相关产品推荐

