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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:11:46