Как исправить «Не удается прочитать свойство»map «неопределенного» в Express

#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;
                })
            })
        })