如何在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.^。