Как исправить 'Не удается прочитать свойство' map 'из undefined' в Express - PullRequest
0 голосов
/ 14 апреля 2019

Я работаю с Express и заполняю несколько схем: Пользователь -> Роль -> Разрешение .Пример: User_1 имеет роль ADMIN и имеет некоторые разрешения: [CREATE_PRODUCT, UPDATE_PRODUCT, DELETE_PRODUCT] Я действительно показал все разрешения пользователя (включая _id, name, ...), но суть в том, что я просто хочу взять толькоимена тех.Я использовал функцию map (), но она не работает.

"express": "^ 4.16.4",
"mongoose": "^ 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)
                    }
                })
            })
        })

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 / allow.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]
    }
]

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

пожалуйста, проверьте ниже код его отлично работает для ваших условий

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;
                })
            })
        })
0 голосов
/ 14 апреля 2019

Необходимо убедиться, что у каждого пользователя есть действительная роль, и у каждой из допустимых ролей есть действительные разрешения.Пользователь (в базе данных) без свойства 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) : []) : []
                }
            })
        })
    })
...