如何在Express中修复'无法读取属性'地图'未定义'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Express中修复'无法读取属性'地图'未定义'相关的知识,希望对你有一定的参考价值。

我正在使用Express,我填充了一些模式:用户 - >角色 - >权限。示例:User_1具有角色ADMIN并具有一些权限:[CREATE_PRODUCT,UPDATE_PRODUCT,DELETE_PRODUCT]我确实显示了用户的所有权限(包括_id,name,...),但重点是我只想采取那些名字。我使用map()函数,但它不起作用。

“表达”:“^ 4.16.4”, “猫鼬”:“^ 5.4.20”,

路线/ userAPI.js:

User
        .find()
        .populate({ path: 'user_role', populate: { path: 'permissions' } })
        .exec((err, users) => {
            if (err) res.status(500).json(err)
            res.status(200).json({
                message: 'sucesss',
                users: users.map(user => {
                    return {
                        user_id: user._id,
                        user_email: user.email,
                        user_password: user.password,
                        user_role: user.user_role.name_role,
                        user_permissions: user.user_role.permissions.map(permission => permission.action_name)
                    }
                })
            })
        })

车型/ user.js的:

email: {...},
  password: {...},
  user_role: {
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'Role',
      default: '5cb2d26f7dd8dd437cdbfe32' //Admin's _id
  }

车型/ role.js:

name_role: {type: String},
  permissions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Permission'}]

车型/ permission.js:

action_code : {
    type: String, 
    unique: true
},
action_name : {
    type: String
}

如果不使用map()则输出

[{
    "user_id": "5cb2dcaeca716b2d80665610",
    "user_email": "a@a.com",
    "user_password": "$2b$10$RWGPv88o4FHCQ.72ELtsUe4eEgzZLJc97EfNPeH74N4Mi9b47h/RW",
    "user_role": "Admin",
    "user_permissions": [{
            "_id": "5cb2ca5674fc4a0f3886c7e0",
            "action_code": "1",
            "action_name": "CREATE_PRODUCT",
            "__v": 0
        },
        {
            "_id": "5cb2cb46ce33eb4978f60d21",
            "action_code": "2",
            "action_name": "UPDATE_PRODUCT",
            "__v": 0
        },
        {
            "_id": "5cb2cb51ce33eb4978f60d22",
            "action_code": "3",
            "action_name": "DELETE_PRODUCT",
            "__v": 0
        }
    ]
} 
]  

输出我期望:

[{
        "user_id": "5cb2dcaeca716b2d80665610",
        "user_email": "a@a.com",
        "user_password": "$2b$10$RWGPv88o4FHCQ.72ELtsUe4eEgzZLJc97EfNPeH74N4Mi9b47h/RW",
        "user_role": "Admin",
        "user_permissions": ["CREATE_PRODUCT, UPDATE_PRODUCT, DELETE_PRODUCT]
    }
]
答案

您需要确保每个用户都具有有效角色,并且每个有效角色都具有有效权限。没有'role_name'属性的用户(在数据库中)将返回此错误。或者像这样检查空值:

 User
    .find()
    .populate({ path: 'user_role', populate: { path: 'permissions' } })
    .exec((err, users) => {
        if (err) res.status(500).json(err)
        res.status(200).json({
            message: 'sucesss',
            users: users.map(user => {
                return {
                    user_id: user._id,
                    user_email: user.email,
                    user_password: user.password,
                    user_role: user.user_role ? user.user_role.name_role : null,
                    user_permissions: user.user_role ? (user.user_role.permissions ? user.user_role.permissions.map(permission => permission.action_name) : []) : []
                }
            })
        })
    })
另一答案

请检查下面的代码,它的工作正常适合您的条件

User
        .find()
        .populate({ path: 'user_role', populate: { path: 'permissions' } })
        .exec((err, users) => {
            if (err) res.status(500).json(err)
            res.status(200).json({
                message: 'sucesss',
                users: users.map(user => {
                                user.user_permissions = user.user_permissions.map(permission =>  permission.action_name);
                                return user;
                })
            })
        })

以上是关于如何在Express中修复'无法读取属性'地图'未定义'的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“无法读取未定义的属性‘标题’”

使用导出函数时无法读取未定义的属性

如何修复 JavaScript 中的“TypeError:无法读取未定义的属性'map'”?

TypeError.无法读取未定义的'$__'属性。无法读取未定义的'$__'属性 - Mongoose v5.^。

如何修复未捕获的 TypeError:无法读取 null 的属性“outerHTML”

如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'