#node.js #express #mongoose #mongoose-schema
#node.js #выражать #мангуст #мангуст-схема
Вопрос:
Я работаю с Express и заполняю некоторые схемы: Пользователь -> Роль -> Разрешение. Пример: Пользователь_1 имеет роль АДМИНИСТРАТОРА и имеет некоторые разрешения: [CREATE_PRODUCT, UPDATE_PRODUCT, DELETE_PRODUCT] Я показал все разрешения пользователя (включая _id, name, …), Но дело в том, что я просто хочу использовать только их имена. Я использовал функцию map (), но она не работает.
«express»: «^ 4.16.4»,
«mongoose»: «^ 5.4.20»,
routes/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)
}
})
})
})
models/user.js:
email: {...},
password: {...},
user_role: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Role',
default: '5cb2d26f7dd8dd437cdbfe32' //Admin's _id
}
models/role.js:
name_role: {type: String},
permissions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Permission'}]
models/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]
}
]
Ответ №1:
Вам необходимо убедиться, что у каждого пользователя есть действительная роль, и каждая из действительных ролей имеет действительные разрешения. Пользователь (в базе данных) без свойства ‘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) : []) : []
}
})
})
})
Ответ №2:
пожалуйста, проверьте приведенный ниже код, чтобы он работал нормально для ваших условий
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;
})
})
})